一、問題描述
循環和遞歸算法之間可以替換實作,但是他們之間有什麼差别呢,時間複雜度,空間複雜度是多少?
我将通過java的棧追蹤來進行探究。
二、實驗
算出1到5的二次方的累計值,分别寫一個循環體和一個test遞歸方法。注釋其中一個方法,代碼如下圖。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLxkkaOJTS61UeJpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLwcTM1MzNzUTM3AzMwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
輸出結果分别如下圖2,圖3所示,圖2是for循環體的棧配置設定情況,圖3為遞歸的情況。
【圖2】
【圖3】
通過分析棧的出棧入棧過程,循環的的調用的棧隻壓入第10行(也就是for語句所在的行号)代碼的指令;而遞歸則總共開辟了5個棧存放test方法。
三、小結
由此可以得出結論:遞歸調用會消耗棧空間,空間複雜度為S(n);時間複雜度為O(n)。而循環方法空間複雜度為S(1),時間複雜度為O(n)。