递归处理斐波那契数时的低效率

本文探讨了斐波那契数列的递归与非递归算法实现,通过具体实例对比了两种算法的计算效率。结果显示,递归算法在计算较大的斐波那契数时效率极低,而非递归算法则表现更佳。

某些递归解法的效率如此之低下,以致于必须避免。

例:斐波那契数(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的编写的程序:

  1. /**
  2. *f(n)=f(n-1)+f(n-2),使用递归算法将产生级差的效率
  3. *@authorscorpio
  4. */
  5. publicclassDiGv{
  6. privatestaticfinalintNUMBER=43;
  7. /**采用递归实现*/
  8. privatestaticintfibonacci_1(intn){
  9. if(n<=1){
  10. return1;
  11. }else{
  12. returnfibonacci_1(n-1)+fibonacci_1(n-2);
  13. }
  14. }
  15. /**采用循环实现,n<1返回0*/
  16. privatestaticintfibonacci_2(intn){
  17. intsum=0;
  18. if(n>0){
  19. sum=1;
  20. intcount=0;
  21. for(inttemp=0,t=0;n!=count;++count){
  22. t=sum;
  23. sum+=temp;
  24. temp=t;
  25. }
  26. }
  27. returnsum;
  28. }
  29. publicstaticvoidmain(String[]args){
  30. longstartTime=0;
  31. longendTime=0;
  32. intresult=0;
  33. System.out.println("递归的拙劣算法/n---------------------/n");
  34. System.out.println("使用递归算法:");
  35. startTime=System.currentTimeMillis();
  36. result=DiGv.fibonacci_1(NUMBER);
  37. endTime=System.currentTimeMillis();
  38. System.out.println("时间差:"+(endTime-startTime)+"/t计算结果:"+result);
  39. System.out.println();
  40. System.out.println("使用非递归算法:");
  41. startTime=System.currentTimeMillis();
  42. result=DiGv.fibonacci_2(NUMBER);
  43. endTime=System.currentTimeMillis();
  44. System.out.println("时间差:"+(endTime-startTime)+"/t计算结果:"+result);
  45. }
  46. }

当NUMBER = 43时,运行的结果为:

递归的拙劣算法
---------------------

使用递归算法:
时间差:5641 计算结果:701408733

使用非递归算法:
时间差:0 计算结果:701408733

这些结果是在我的电脑配置下的结果,不同电脑的结果不同,但通过对比仍可显而易见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值