引言
之前在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项的耗时结果为:
可以看到当求到比较后面的项时,尾递归还是要快很多的。