天天看點

java循環和遞歸幹貨

一、問題描述

循環和遞歸算法之間可以替換實作,但是他們之間有什麼差别呢,時間複雜度,空間複雜度是多少?

我将通過java的棧追蹤來進行探究。

二、實驗

算出1到5的二次方的累計值,分别寫一個循環體和一個test遞歸方法。注釋其中一個方法,代碼如下圖。

java循環和遞歸幹貨

輸出結果分别如下圖2,圖3所示,圖2是for循環體的棧配置設定情況,圖3為遞歸的情況。

java循環和遞歸幹貨

【圖2】

java循環和遞歸幹貨

【圖3】

通過分析棧的出棧入棧過程,循環的的調用的棧隻壓入第10行(也就是for語句所在的行号)代碼的指令;而遞歸則總共開辟了5個棧存放test方法。

三、小結

由此可以得出結論:遞歸調用會消耗棧空間,空間複雜度為S(n);時間複雜度為O(n)。而循環方法空間複雜度為S(1),時間複雜度為O(n)。