轉載:
以斐波那契數列爲例分析遞歸算法的時間複雜度和空間複雜度
這個很直觀https://blog.csdn.net/superwangxinrui/article/details/79626870
這個有點複雜
http://www.javashuo.com/article/p-hpncmoub-bp.html
斐波拉切數列----生兔子,青蛙跳臺階
青蛙跳臺階
題目描述
一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。
遞歸
public class Main{ public int JumpFloor(int target){ if(target==1){ return 1; } if(target==2){ return 2; } return JumpFloor(target-1)+JumpFloor(target-2);//第一次跳一步或者第一次跳兩步,下次接着跳 } }
運行時間:468ms
佔用內存:9104k
時間複雜度:
在遞歸調用過程中Fib(3)被計算了2次,Fib(2)被計算了3次。Fib(1)被調用了5次,Fib(0)中被調用了3次。所以,遞歸的效率低下,但優點是代碼簡單,容易理解。
等於二叉樹節點的個數:O(2^n)
非遞歸
public class Main{ public int JumpFloor(int target){ if(target==1){ return 1; } if(target==2){ return 2; } int sum=0; int a=1; int b=2; for(int i=3;i<=target;i++){ sum=a+b; a=b;//f(n-2) b=sum;//f(n-1) } return JumpFloor(target-1)+JumpFloor(target-2);//第一次跳一步或者第一次跳兩步,下次接着跳 } }
時間複雜度:O(n)
運行時間:15ms
佔用時間:9408k