尾递归解析

c语言尾递归解析

试用于新手初学尾递归

最简单的的递归形式是把递归调用置于函数的尾部,即正好在return语句之前。因为递归调用在函数的尾部。尾递归是最简单的递归形式,因为它相当于循环。

我们分别用循环和和尾递归计算阶乘,方便我们做出区分
### 列如
#include 
long fact (int n);
long rfact(int n);
int main()
{
     
	int num;
	
	printf("求所给数的阶乘.\n");
	printf("请输入 0-12的整数:\n");
	while(scanf("%d",&num)==1)
	{
     
		if(num<0)
			printf("没有这个数, please.\n");
		else if(num>12)
			printf("让这个数小于13.\n");
		else
		{
      
			printf("\n用递归: 你输入的:%d 它的阶乘为=%ld\n",num,rfact(num));
			printf("用for循环:你输入的:%d 它的阶乘为=%ld\n",num,fact(num));
		}
	}
	printf("再见.\n");
}
long fact(int n)//使用循环函数 
{
     
	long ans;
	for (ans=1;n>1;n--)
	{
     
		ans=ans*n;
	}
	return ans;
}
long rfact(int n)//使用递归函数 
{
     
	long ans;
	if(n>0)
	{
     
		ans=n*rfact(n-1);
	}
	else
	{
      
		ans=1;
		
	}
	printf("\n当房间为(n=%d)的时候ans=%ld",n,ans); 
	return ans;
 } 

下面是该程序运行的示例
尾递归解析_第1张图片
**尾递归解析如下 **

/*这里的递归其实可以把它想象成一个一个箱子相互嵌套着
我们就根据上面的例子:我们所用的函数rfast当我们给出n的值为6的时候
我们开始执行这个函数,我们想象n=6的时候为第一个大房间,n=5的时候为第二个房间,递归中n的值会逐渐减小
直到n=0为最后一个房间的时候结束,,在第一个房间里我们执行if语句ans=n*rfact(n-1)
注意rfact(n-1)是我们是我们n=5第二个房间的值,这里ans它的值就等于6乘以第二个房间中return ans的值
依次类推 ,直到n=1的时候我们再次执行ans=n*rfact(n-1),这里ans的值就为1乘以最后一个房间 (n=0) return ans
的值 ,而最后一个房间(n=0)由于else语句我们得到了ans=1,也就是return的值为1,所以在(n=1)这个房间里的
ans的值就为1乘以1等于1,在(n=2)这个房间里ans的的值就为2乘以1等于2,(n=3)这个房间里的ans的值就为
3乘以2得6,(n=4)这个房间里的值就为6乘以4得24,(n=5)这个房间里的值就为24乘以5得120,(n=6)这个房间
的值就为6乘以120得720,记住(n=6)为我们的第一个房间它的return的值就为720 */ 

那么,演示这个程序的目的是什么?
因为尾递归是递归中最简单的形式,比较容易理解,在某些情况下,不能用简单的循环代替递归
因此读者还是好好理解递归。

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