函数递归(套娃)

C允许一个函数调用其本身,这种调用过程被称作递归(recursion)

这里我们先来看看简单的栗子:主函数main()的自我调用

#include 
int main()
{
	printf("你好");
	main();
	return 0;
}

大家可以想一下这个程序运行后的结果是--------无限循环打印你好      如下:

函数递归(套娃)_第1张图片

 分析:

函数递归(套娃)_第2张图片

每次 printf("你好"); 后,都会再次调用 main() , main() 里面有 printf("你好"); 和 main(),然后继续调用main()-------再打印,再调用,再打印,再调用,再…………

因为没有一个限制条件让它停止,所以调用一直进行(相当于循环没有限制条件而变成了死循环

而这样的递归是没有意义的,是错误的递归。

总结:

1.存在限制条件,当满足这个限制条件的时候,递归便不再继续。

2.每次递归调用之后越来越接近这个限制条件。

 来看个正确的递归:

用函数的递归求n的阶乘

我们先确定是输入n值,然后确定函数名为JC(阶乘)(流下了没技术的眼泪),调用函数JC并打印。

#include 
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 
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.

函数递归(套娃)_第3张图片

 解析与调用main()相同:

函数递归(套娃)_第4张图片

 


本节较短,主要时理解函数是怎么样递归的,有不对的地方欢迎各位指正。

你可能感兴趣的:(笔记,c语言)