在学一些函数式语言的时候,经常遇到尾递归。总结一下
什么是尾递归
递归是指一个函数直接或者间接调用其本身。递归会造成什么问题呢,每次函数调用,肯定需要一个方法栈来保存相关信息的。如果递归深度太深的话,必然导致栈溢出。举一个例子,斐波那契函数吧
public int fib(int n)
{
if(n<2){
return n;
}
return fib(n-1)+fib(n-2);
}
上面代码就是传统的递归.如果n太大,就可能导致栈溢出了
用尾递归来实现:
public int fib(int n,int acc1,int acc2)
{
if(n==0)
return acc1;
return fib(n-1,acc2,acc1+acc2);
}
尾递归的本质是:将单次计算的结果缓存起来,传递给下次调用,相当于自动累积。
尾递归的用途
在Java等命令式语言中,尾递归使用非常少见,因为我们可以直接用循环解决。而在函数式语言中,尾递归却是一种神器,要实现循环就靠它了。
尾递归的优化
很多人可能会有疑问,为什么尾递归也是递归,却不会造成栈溢出呢?因为编译器通常都会对尾递归进行优化。编译器会发现根本没有必要存储栈信息了,因而会在函数尾直接清空相关的栈。
更多的信息欢迎访问我的空间
参考资料
1.http://en.wikipedia.org/wiki/Tail_call
2.http://www.cnblogs.com/JeffreyZhao/archive/2009/04/01/tail-recursion-explanation.html
分享到:
相关推荐
1. **尾递归**:如果递归调用是函数的最后一个操作且没有其他操作依赖于递归调用的结果,那么可以优化为尾递归,一些编译器和解释器会优化尾递归,避免栈溢出。 2. **记忆化**:对已经计算过的子问题结果进行缓存,...
这种解决问题的方法简洁而优雅,但也需要注意递归深度过深可能导致栈溢出,因此在实际应用中,我们往往需要考虑优化递归算法,比如通过尾递归或者动态规划等方法。 总的来说,Python递归函数和河内塔问题为我们提供...
因此,需要合理控制递归深度,并考虑是否可以使用尾递归优化或迭代的方式来替代。 在JavaScript中,学习和掌握递归是一项重要的技能,它可以极大地提高代码的简洁性和可读性。对于开发者来说,理解递归的基本原理,...
这种方法称为尾递归优化,虽然不是所有编程语言都支持,但在某些语言(如Scheme)中是内置支持的。 除了这些,我们还可以考虑使用哈希表或字典等关联数组结构来存储阶乘值,其查找速度通常比数组更快,因为它们提供...
一类递归RBF神经网络模型的稳定性讨论.pdf 一种估计人工神经网络泛化误差的新方法.pdf 一种基于遗传算法的模糊神经网络最优控制.pdf 一种建立模糊模型的粗糙集方法.pdf 一种自适应模糊控制器.pdf 遗传算法的自适应...
一类递归RBF神经网络模型的稳定性讨论.pdf 不确定性线性系统模型处理的一种新方法.pdf 中介粗集及其在数据挖掘中的应用.caj 二进神经网络隐元数目最小上界研究.pdf 以地物识别和分类为目标的高光谱数据挖掘.caj 信息...
一类递归RBF神经网络模型的稳定性讨论.pdf 不确定性线性系统模型处理的一种新方法.pdf 中介粗集及其在数据挖掘中的应用.caj 二进神经网络隐元数目最小上界研究.pdf 以地物识别和分类为目标的高光谱数据挖掘.caj 信息...
一类递归RBF神经网络模型的稳定性讨论.pdf 不确定性线性系统模型处理的一种新方法.pdf 中介粗集及其在数据挖掘中的应用.caj 二进神经网络隐元数目最小上界研究.pdf 以地物识别和分类为目标的高光谱数据挖掘.caj 信息...