某些递归解法的效率如此之低下,以致于必须避免。
例:斐波那契数(Fibonacci) 早在13世纪,数学家莱昂纳多斐波那契(Leonardo Fibonacci)就提出了一个用以模拟一对兔子后代数目的整数序列,这些后来称为斐波那契序列(Fibonacci sequence)的数名人惊讶的出现在许多应用中。
序列为:1,1,2,3,5,8,13....
公式为:F(n) = F(n-1) + F(n-2)
使用递归算法将造成大量的重复计算,而它每层的递归会形成反向的Fibonacci序列。
如下如:
操作----------计算次数
Fib(5) 1
Fib(4)1
Fib(3) 2
Fib(2) 3
Fib(1) 5
而Fib(0)等于Fib(2)的计算次数
很明显,此时使用递归算法的效率要低得多。
以下是我用Java的编写的程序:
- /**
- *f(n)=f(n-1)+f(n-2),使用递归算法将产生级差的效率
- *@authorscorpio
- */
- publicclassDiGv{
- privatestaticfinalintNUMBER=43;
- /**采用递归实现*/
- privatestaticintfibonacci_1(intn){
- if(n<=1){
- return1;
- }else{
- returnfibonacci_1(n-1)+fibonacci_1(n-2);
- }
- }
- /**采用循环实现,n<1返回0*/
- privatestaticintfibonacci_2(intn){
- intsum=0;
- if(n>0){
- sum=1;
- intcount=0;
- for(inttemp=0,t=0;n!=count;++count){
- t=sum;
- sum+=temp;
- temp=t;
- }
- }
- returnsum;
- }
- publicstaticvoidmain(String[]args){
- longstartTime=0;
- longendTime=0;
- intresult=0;
- System.out.println("递归的拙劣算法/n---------------------/n");
- System.out.println("使用递归算法:");
- startTime=System.currentTimeMillis();
- result=DiGv.fibonacci_1(NUMBER);
- endTime=System.currentTimeMillis();
- System.out.println("时间差:"+(endTime-startTime)+"/t计算结果:"+result);
- System.out.println();
- System.out.println("使用非递归算法:");
- startTime=System.currentTimeMillis();
- result=DiGv.fibonacci_2(NUMBER);
- endTime=System.currentTimeMillis();
- System.out.println("时间差:"+(endTime-startTime)+"/t计算结果:"+result);
- }
- }
当NUMBER = 43时,运行的结果为:
递归的拙劣算法
---------------------
使用递归算法:
时间差:5641 计算结果:701408733
使用非递归算法:
时间差:0 计算结果:701408733
这些结果是在我的电脑配置下的结果,不同电脑的结果不同,但通过对比仍可显而易见。
本文探讨了斐波那契数列的递归与非递归算法实现,通过具体实例对比了两种算法的计算效率。结果显示,递归算法在计算较大的斐波那契数时效率极低,而非递归算法则表现更佳。
8173

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



