演算法筆記 遞迴 迭代

2022-03-10 11:35:12 字數 1008 閱讀 5484

例題1 階乘函式

int func(int

n)

乙個完整的階乘函式應該像上面一樣寫,一般的書都是預設了輸入的時候不會輸出超過範圍的數字,但是我們自己寫程式的時候,應該要考慮所有的情況。乙個遞迴應該能讓所有輸入的值都有乙個出口。

所以一般來說,遞迴應該由三個部分組成:遞迴體(自己呼叫自己),遞迴出口,和容錯。

例題2 斐波那契數列

int func(int

n)

這兩個例題,都是最基本的遞迴入門函式。但假如,我們要使用不支援遞迴的語言去實現遞迴的作用,那我們應該?

對於任何遞迴函式,都存在功能等價的迭代實現

所以讓我們試著,把上面兩個任務,都用迭代的方法去實現:

階乘函式:

int func(int

n)

return

p;}

斐波那契數列:

int func(int

n)

return

c;}

那麼此時,問題來了?我們不可能同時寫兩種方法,我們應該如何選擇更好的寫法?

對於例題一來說,遞迴函式,要計算n次,時間複雜度是o(n),空間複雜度也是o(n)。迭代的方法呢,計算n次,時間複雜度是o(n),空間複雜度是o(1),自己新用到了乙個變數,所以兩個的差別並不大,都可以選擇。

對於例題二來說,遞迴函式,我們可以畫乙個類似於二叉樹的模型,根據規律大概可以估算它每次給n加1,計算就要翻倍,實際是要計算大概1.618的n次方次,所以時間複雜度大概是o(2^n)次,而空間複雜度也差不多是這樣,根據實際的測算,計算n=100的時候,就等到咱去世了也沒有結果0_0,可以說是乙個並沒什麼用的程式了。而對迭代函式來說,還是計算n次,空間複雜度也是n(1),所以這時候,迭代的效率要高很多。

所以我們對比也得到了遞迴函式的優點和缺點,優點是易理解方便,缺點是效能差,原因有兩個:1.必須遞迴棧的支援;2.可能出現子問題重疊現象。

演算法 迭代和遞迴

在日常程式的編寫中,複雜的專案日益增多,在後期的 優化上需要花更多的時間和精力。在前期的規劃上也越來越重要,前期良好的規劃可以避免後期遇到些奇怪的問題。這次部落格我希望通過講解下迭代和遞迴的具體應用場景,來表達寫程式是前期規劃的作用和解決具體問題所需要的方法。遞迴和迭代,都是一種迴圈演算法。遞迴在迴...

演算法 迭代和遞迴

遞迴 遞迴常見的優化手段有尾遞迴,迭代,迴圈 尾遞迴 在每一次遞迴的過程中保持了上一次計算的狀態,也就是 線性迭代過程 尾遞迴和一般的遞迴不同在對記憶體的占用,普通遞迴建立stack累積而後計算收縮,尾遞迴只會占用恒量的記憶體 和迭代一樣 尾遞迴是指,在函式返回的時候,呼叫自身本身,並且,retur...

迭代演算法與遞迴演算法概述

遞迴 recursive 的基本概念 程式呼叫自身的程式設計技巧稱為遞迴,是函式自己呼叫自己。迭代 iterative 的基本概念 利用變數的原值推算出變數的乙個新值,如果遞迴是自己呼叫自己的話,迭代就是a不停的呼叫b。遞迴與迭代都是基於控制結構 迭代用重複結構,而遞迴用選擇結構。遞迴與迭代都涉及重...