斐波那契数列的概念可以参考。
数列内容为 1 1 3 5 8 13 .......
1.用普通递归算法
private static long normalFibonacci(int n) { if (n == 0 || n == 1) { return n; } return normalFibonacci(n - 1) + normalFibonacci(n - 2); }
测试50项耗时:
这种方式是由于栈空间占用导致耗时。
2.采取尾递归方式
从尾部开始,将计算的值保存起来用参数传入,节省栈空间从而提高效率。
从n 开始计算第一项的值,直到第1项,返回结果值。
算法为:
private static long tailCallFibonacci(int n, long value, long result) { if (n == 1) { return result; } return tailCallFibonacci(n - 1, result, value + result); }
例如:
计算 tailCallFibonacci(5,0,1)
下一步 tailCallFibonacci(4,1,1)
下一步 tailCallFibonacci(3,1,2)
下一步 tailCallFibonacci(2,2,3)
下一步 tailCallFibonacci(1,3,5)
此时 n=1,返回 result ---》 5.
测试50项耗时:
相比于正常递归尾递归效率要快得多。
main方法测试代码
public static void main(String[] args) { long timeMillis = System.currentTimeMillis(); // System.out.println(normalFibonacci(50)); long end = System.currentTimeMillis(); System.out.println("普通递归耗时:"+ (end - timeMillis)); System.out.println(tailCallFibonacci(50, 0, 1)); timeMillis = System.currentTimeMillis(); System.out.println("尾递归耗时:"+ (timeMillis - end)); }
可以考虑改些下阶乘的递归为尾递归 - -