元小白(猿小白)进阶日记:六(函数调用方式)

1、函数的嵌套调用
在一个函数里调用另一个函数

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void New_Line()
{
	printf("haha\n");
}
void Three_Line()
{
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		New_Line( );//在函数体中调用了另一个函数。
	}
}
int main()
{
	Three_Line();
	return 0;
}

2、函数的链式访问
把另一个函数的返回值当作另一个函数的参数

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>//strlen()和strcat()函数要用的头文件
int main()
{
	char arr[20] = "JAVA";
	int ret = strlen(strcat(arr, "HELLO"));
	//此处将strcat()函数的返回值作为strlen()函数的参数。
	//strlen()函数用以求字符串的长度,且求出的长度不包含字符串中最后一个‘/0’.
	//strcat()函数用于将两个字符串串起来,连成一个字符串.
	printf("%d\n", ret);
	return 0;
}

3、函数的声明和定义
函数声明: 包含 函数返回值类型 函数名 (参数类型 参数名)
要求: 先声明后使用。函数声明一般放在头文件中。
函数定义: 指函数的具体实现,交代函数的功能

text.h:放置函数的声明

#ifndef  _TEXT_H_
#define _TEXT_H_
//函数声明
int Add(int x,int y)
#endif  //_TEXT_H_

text.c:放置函数的实现

#include "text.h"
//函数的实现
int Add(int x,int y)
{
	return x+y;
}

4、函数的递归
在一个函数中调用自身函数
主要思考方向:大事化小,当小到一定程度时,可以确定其值,
递归连个必要条件:存在限制条件,当满足此条件时,递归便结束
每次递归调用后都越来越接近这个结束递归的条件

练习

1、接受一个整型值(无符号),按照顺序打印他的每一位

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void Print(int n)
{
	if (n > 9)
	{
		Print(n/10);
	}
	printf("%d   ", n % 10);
}
int main()
{
	int num = 0;
	scanf("%d", &num);
	printf("num=%d\n", num);
	Print(num);
	return 0;
}

2、不建立临时变量,求字符串长度

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int Strlen(const char* str)
{
	if (*str=='\0')
	{
		return 0;
	}
	else
	{
		return 1 + Strlen(str + 1);//str表示字符串首地址,str+1代表下一地址,
	}
}
int main()
{
	char* p = "abcdef";
	int len = Strlen(p);
	printf("len=%d\n", len);
	return 0;
}

5、递归与迭代

递归求 n!

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int Factorial(int n)
{
	if (n<=1)
	{
		return 1;
	}
	else
	{
		return n*Factorial(n-1);
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int result=Factorial(n);
	printf("%d!=%d", n, result);
	return 0;
}

递归求斐波那契数列中第n个斐波那契数

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int Fib(int n)
{
	if (n <= 2)
	{
		return 1;
	}
	else
	{
		return Fib(n-1)+Fib(n-2);
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int result =Fib(n);
	printf("%d",result);
	return 0;
}

//在这里运用了递归调用,但是当数字太大时,效率会很低,这是由于,每调用一次函数,就需要开辟出一块空间,而每调用结束一次,就要释放一次空间,使得空间成本和时间成本都变得很大。

迭代求n!

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int Factorical(int n)
{
	int result = 1;
	while (n > 1)
	{
		result *= n;
		n -= 1;
	}
	return result;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int result = Factorical(n);
	printf("%d", result);
	return 0;
}

迭代求第n个斐波那契数

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int Fib(int n)
{
	int result;
	int pre_result;
	int next_older_result;
	result = pre_result=1;
	while (n > 2)
	{
		n -= 1;
		next_older_result = pre_result;
		pre_result = result;
		result = pre_result + next_older_result;
	}
	return result;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int result1 = Fib(n);
	printf("%d", result1);
	return 0;
}

虽然迭代法比递归效率更高,但递归更易理解,代码更简单,迭代代码更复杂,

猜你喜欢

转载自blog.csdn.net/weixin_44748803/article/details/89044041