C允许一个函数调用其本身,这种调用过程被称作递归(recursion)
这里我们先来看看简单的栗子:主函数main()的自我调用
#include <stdio.h>
int main()
{
printf("你好");
main();
return 0;
}
大家可以想一下这个程序运行后的结果是--------无限循环打印你好 如下:
分析:
每次 printf("你好"); 后,都会再次调用 main() , main() 里面有 printf("你好"); 和 main(),然后继续调用main()-------再打印,再调用,再打印,再调用,再…………
因为没有一个限制条件让它停止,所以调用一直进行(相当于循环没有限制条件而变成了死循环)
而这样的递归是没有意义的,是错误的递归。
总结:
1.存在限制条件,当满足这个限制条件的时候,递归便不再继续。
2.每次递归调用之后越来越接近这个限制条件。
来看个正确的递归:
用函数的递归求n的阶乘
我们先确定是输入n值,然后确定函数名为JC(阶乘)(流下了没技术的眼泪)😂,调用函数JC并打印。
#include <stdio.h> int main() { int n = 0; int ret = 0; scanf("%d",&n); ret=JC(n); printf("%d",ret); return 0; }
这里的ret直接为n的阶乘的值
接下来我们定义函数JC
并使它能实现函数的递归,记得存在限制条件,且不断向限制条件靠拢,以便于递归的停止
n的阶乘=JC(n):
n*(n-1)*(n-2)*...*1
=n * (n-1)的阶乘 = n*JC(n-1) //因此n必须大于1,不能=1,否则n*JC(n-1) 不成立
则限制条件为n>1
n=1时,1的阶乘为1直接return 1;
int JC(int i) { if (i > 1) return i*JC(i - 1); else return 1; }
完整程序如下:
#include <stdio.h> int JC(int i) { if (i > 1) return i*JC(i - 1); else return 1; } int main() { int n = 0; int ret = 0; scanf("%d",&n); ret=JC(n); printf("%d",ret); return 0; }
这里输入3,n=3,3的阶乘为6.
解析与调用main()相同:
本节较短,主要时理解函数是怎么样递归的,有不对的地方欢迎各位指正。