定义:如果一个函数中所有的递归形式的调用都出现函数的末尾,我们叫这个递归是尾递归。
更准确的说:当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分,才是尾递归。
特点:在回归过程中不用做任何操作。于是,在调用过程中就不是开辟新的栈,而是覆盖当前的栈,因此程序所需的栈就大大的缩小了
一般来说,尾递归的函数需要增加一个变量,叫做递归深度,用来控制递归的次数,另一个变量用来存放运算的结果。
#include <stdio.h>
int tailRecursion(int x,int y);
int main()
{
int x,sum;
puts("请输入一个非负整数:");
scanf_s("%d",&x);
sum = tailRecursion(x,1);
printf("%d! = %d\n\n",x,sum);
return 0;
}
int tailRecursion(int x,int y)
{
if(x == 0)
return 1;
else if(x == 1)
return y;
else
return tailRecursion(x-1,x*y);//递归调用是一条完整语句,而非表达式的一部分
//一边计算一边回归,而不是像普通递归,最后再回归
}