遞迴與迴圈
大一學c++的時候,老師說過遞迴與迴圈是可以相互轉化的,當時好像是用來兩重迴圈解決遞迴問題,演算法的複雜度依然是o(n)。最近發現可以通過模擬實現棧結構通過一重迴圈實現非遞迴演算法。
遞迴必須滿足以下兩個條件:
首先我們給出乙個最簡單的遞迴實現,演算法的目的是為了得到乙個大於等於10的數字。
1
2
3
4
5
6
7
function
recursion(
$data
)
return
recursion(
$data
+ 1);
}
以上**,當$data <= 10時,呼叫自己並累加1。
非遞迴演算法實現如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function
norecursion(
$data
)
$stack
->push(
$result
+ 1);
}
while
(true);
return
$result
;
}
為了儲存每次迴圈產生的中間結果,我們將結果壓入乙個棧中,等待下次處理。splstack類為php提供的spl標準棧結構。
我們知道,遞迴演算法雖然寫起來要比用迴圈來解決問題更加方便,但它所帶來的效能問題也是不能忽略的。由於每次遞迴呼叫都需要儲存本次執行產生的中間結果並壓入棧中等待遞迴返回,對記憶體和cpu的消耗都非常高。使用模擬棧實現的非遞迴演算法,能夠帶來本質上的效能提公升,且編碼並不是非常複雜。原則上推薦在能夠使用以上演算法實現非遞迴演算法的情況下,盡量少用遞迴演算法。
迴圈與遞迴
優缺點 迴圈效率更高,遞迴容易理解 是大家普遍的觀點。儘管兩種想法在時間複雜度和空間複雜度上是等價的。但遞迴的有乙個弱勢 函式呼叫開銷如引數傳遞和堆疊之類的開銷,會導致在層次過深的時候,系統崩潰。遞迴是用棧機制實現的 c 每深入一層,都要占去一塊棧資料區域,對巢狀層數深的一些演算法,遞迴會力不從心,...
遞迴與迴圈
記得參加某公司的筆試題,有一道題很簡單要求用遞迴方法,當時不太明白什麼是遞迴,刷刷用迴圈寫了出來,結果錯了.所以一定要搞清楚遞迴與迴圈的概念。遞迴 遞迴是乙個函式的內部呼叫這個函式自身 一定記住是呼叫自身的函式 迴圈 迴圈是通過設定計算的初始值及終止條件,在乙個範圍內重複運算 for,while等迴...
迴圈與遞迴
相比較迴圈,遞迴的 非常簡潔。遞迴是函式呼叫自身,而函式呼叫是有時間和空間的消耗 此外,遞迴中有可能很多計算都是重複的,從而對效能帶來很大的負面影響。遞迴的本質是把乙個問題分解成兩個或者多個問題。如果多個問題存在相互重疊的部分,那麼就存在重複計算。除了執行效率之外,遞迴還有可能引起更加嚴重的問題 呼...