引言
之前在lintcode上刷算法入门题,366题是求斐波那契数列,当时就想用递归应该很快就ac了,最后递归是没写错,但是提交报时间超限了,也就引出了这篇文章——尾递归。
测试
先来看一下,常规的斐波那契递归写法,假设第一项为0,第二项为1:
public int fibonacci(int n) {
if(n == 1) {
return 0;
}
if(n == 2) {
return 1;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
测试第40项的耗时结果为:

斐波那契的尾递归写法:
public int lastFibonacci(int n, int ret1, int ret2) {
if(n == 1) {
return ret1;
}
return lastFibonacci(n - 1, ret2, ret1 + ret2);
}
测试尾递归求第40项的耗时结果为:

可以看到当求到比较后面的项时,尾递归还是要快很多的。
分析总结
下面就来分析下尾递归到底快在了哪里
正常递归
对于斐波那契数列的正常递归,有点类似于二叉树的结构,我以f(6)为例,看下图

本文通过对比斐波那契数列的常规递归和尾递归实现,探讨了尾递归在算法效率上的优势。测试显示,尾递归在计算较大项时比常规递归更快,避免了重复计算和栈内存的指数增长。通过示例解释了尾递归如何通过参数传递已计算结果,以线性方式增加内存占用。
最低0.47元/天 解锁文章
4937

被折叠的 条评论
为什么被折叠?



