递归与循环

  如果我们需要重复多次计算相同的问题,通常可以选择递归或者循环

  递归的好处是代码简洁

  但是递归也有明显的缺点:

  • 递归是由于函数调用自身,而函数调用是需要有时间和空间的消耗的。每一函数调用,都需要在内存栈中分配空间以保存参数,返回地址和临时变量,而且往栈中压入数据和弹出数据都需要时间。
  • 递归中有可能很多计算都是重复的。递归的本质是把一个大问题分解成小问题,但是多个小问题之间会有重叠的部分
  • 递归可能会引发问题:调用栈溢出。

斐波拉契数列

public class Exam9_Fibonacci {
    public static void main(String[] args) {
        int n=10;    
        //递归
        long start = System.currentTimeMillis();            
        System.out.println("当n= "+n+" 时的结果是 "+ Fibonacci(n));
        long end = System.currentTimeMillis();
        System.out.println("递归方式:");
        System.out.println("运行的时间是"+(end-start)+"ms");
        
        //循环
        long start1 = System.currentTimeMillis();    
        System.out.println("
循环方式:");
        Circulation(n);
        long end1 = System.currentTimeMillis();
        System.out.println("运行的时间是"+(end1-start1)+"ms");
    }
    

    //利用递归方式
    private static long Fibonacci(int n) {
        if(n<=0)
            return 0;
        if(n==1)
            return 1;        
        return Fibonacci(n-1) + Fibonacci(n-2);
    }
    
    //利用循环方式
    private static long Circulation(int n) {
        
        if(n<=0)
            return 0;
        if(n==1)
            return 1;
        
        long finSOne= 0;
        long finSTwo = 1;
        long fibN= 0;
        
        for(int i=2;i<=n;i++)
        {
            fibN = finSOne+finSTwo;
            finSOne = finSTwo;
            finSTwo = fibN;        
        }
        return fibN;
    }
}

得到的结果是:

n值

最终结果

递归方式对Fibonacci()

方法的调用次数

递归方法时间(ms)

循环方法(ms)

10

55

177

1

0

20

6765

21891

3

0

30

832040

2692537

14

0

40

102334155

331160281

1254

0

50

12586269025

40730022147

150514

0

60

时间太长

明显的看出,时间复杂的:

递归方式是以n的指数的方式递增的

循环是O(n)

所以,对于斐波那契数列,循环的方式更好

原文地址:https://www.cnblogs.com/tech-bird/p/3857370.html