递归与尾递归

如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。尾递归函数的特点是在回归过程中不用做任何操作,这个特性很重要,因为大多数现代的编译器会利用这种特点自动生成优化的代码。

递归阶乘

long long int fact(long long int  n)
{
	if (n<0)
		return 0;
	else if (n==0)
		return 0;
	else if (n==1)
		return 1;
	else
		return n*fact(n-1);
}



尾递归阶乘
long long int facttail(long long int  n, long long int  a)
{
	if (n<0)
		return 0;
	else if (n==0)
		return 0;
	else if (n==1)
		return a;
	else
		return facttail(n-1, a*n);
}



对于任意 n>=0,我们有如下公式:
常规阶乘 F(n) =  n>1 ? 
n*F(n-1) : 1
尾递归阶乘 F(n, a) =  n>1 ?  F(n-1, n=a) : a,这里a初始化为1
可以看到数学模型设计在其中的作用,我们常见的阶乘方法是无法实现尾递归的。

C语言中的尾递归主要是减少了栈帧分配和回收的资源分配。

参考资料:
http://baike.baidu.com/view/1439396.htm

计算机是两门自然科学成果结合的产物:数学与物理

书籍:
《算法精解:C语言描述》第三章

你可能感兴趣的:(递归与尾递归)