int Fib(int n) { if( n < 2) return n; return (Fib(n-1)+Fib(n-2)); }
这样写出来的代码很简洁,来分析一下它的执行过程,咱们给n=5:
可能这样你还看不出问题,其实上面的图至关是一个树状结构:
红色的部分在以后又会被求到,若是咱们给的数值不是5是一个更大的数,则被重复计算和调用的数和次数会变得更多。可见,在这样一个过程当中,咱们把某些值一直在重复计算,再加上重复的开辟栈空间,使得它的效率变得很是低,大家能够试着求一下第40 50个斐波那契额。
二、尾递归
尾部递归是一种编程技巧。若是在递归函数中,递归调用返回的结果总被直接返回,则称为尾部递归。尾部递归的函数有助将算法转化成函数编程语言,并且从编译器角度来讲,亦容易优化成为普通循环。这是由于从电脑的基本面来讲,全部的循环都是利用重复移跳到代码的开头来实现的。若是有尾部归递,就只须要叠套一个堆栈,由于电脑只须要将函数的参数改变再从新调用一次。
1 int Fib(int n, int ret1, int ret2)
2
3 {
4 if (n ==0 )
5 {
6 return ret1;
7 }
8 else
9 {
10 return Fib(n - 1, ret2, ret1 +ret2);
11 }
12 }
int Fib(int n) { int num1 = 1; int num2 = num1; int num3 = num1; while (n > 2) { num3 = num1 + num2; num1 = num2; num2 = num3; n--; } return num3; }