Day5——函数与递归
函数:
函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。
您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的。
应注意函数的名称、返回类型和参数、函数定义的实际主体。
C 标准库提供了大量的程序可以调用的内置函数。
包含:调用函数;( printf 就是常用的调用函数)
当我们调用函数时,对其传入的参数和函数体内接收到的参数其实并不是同一个变量。
(调用函数时向函数传入的参数称作实际参数,简称实参,函数体内部用于接收外部调用时传入的参数的参数称为形式参数,简称形参。)
内部函数:如果一个函数只能被本文件中其他函数所调用,它称为内部函数。在定义内部函数时,在函数名和函数类型的前面加 static
外部函数:如果在定义函数时,在函数的首部的最左端加关键字 extern,则此函数是外部函数,可供其它文件调用。
自定义函数;由自己写一个函数(需要声明和定义),
#include <stdio.h>
int Max(int a, int b, int c) //自定义
{
int max=a;
if(b>max){
max=b;
if(c>max){
max=c;
}
} else {
if(c>max){
max=c;
}
}
return max;
}
int main()
{
int x, y, z, maxOne;
printf("请输入三个数字(空格分隔):");
scanf("%d%d%d",&x,&y,&z);
maxOne=Max(x, y, z); //调用
printf("\n");
printf("最大数为:%d; \n",maxOne);
return 0;
}
函数递归
合理运用函数嵌套(调用自身)达到大事化小小事化了的目的;避免出现死循环导致栈溢出,要合理设置判断条件;
举个例子:
从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?"从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……'"
如果没有限制条件就会死循环,结果就是栈溢出,程序死掉;
#include <stdio.h> int fibonacci(int n) { if(n <= 2) { return 1; } else { return fibonacci(n - 1) + fibonacci(n - 2); //实现 } } int main() { int n;//第n项 scanf("%d", &n); printf("%d\n", fibonacci(n)); return 0; }
递归是一个简洁的概念,同时也是一种很有用的手段。但是,使用递归是要付出代价的。与直接的语句(如while循环)相比,递归函数会耗费更多的运行时间,并且要占用大量的栈空间。递归函数每次调用自身时,都需要把它的状态存到栈中,以便在它调用完自身后,程序可以返回到它原来的状态。未经精心设计的递归函数总是会带来麻烦。