标签:
int Fib(int n) { if( n < 2) return n; return (Fib(n-1)+Fib(n-2)); }
这样写出来的代码很简洁,来分析一下它的执行过程,我们给n=5:
可能这样你还看不出问题,其实上面的图相当是一个树状结构:
红色的部分在之后又会被求到,如果我们给的数值不是5是一个更大的数,则被重复计算和调用的数和次数会变得更多。可见,在这样一个过程中,我们把某些值一直在重复计算,再加上重复的开辟栈空间,使得它的效率变得非常低,你们可以试着求一下第40 50个斐波那契额。
2、尾递归
尾部递归是一种编程技巧。如果在递归函数中,递归调用返回的结果总被直接返回,则称为尾部递归。尾部递归的函数有助将算法转化成函数编程语言,而且从编译器角度来说,亦容易优化成为普通循环。这是因为从电脑的基本面来说,所有的循环都是利用重复移跳到代码的开头来实现的。如果有尾部归递,就只需要叠套一个堆栈,因为电脑只需要将函数的参数改变再重新调用一次。
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; }
标签:
原文地址:http://www.cnblogs.com/MrListening/p/5372245.html