資料結構 遞迴與迴圈

2021-08-31 13:26:07 字數 1487 閱讀 7150

需要重複多次計算相同的問題,通常可以選擇用遞迴或者迴圈兩種不同的方法,遞迴是在函式內部用函式自身,迴圈則是通過設定計算的初始值及終止條件,在乙個範圍內重複運算。

通常遞迴會比迴圈**簡潔,更加容易實現。遞迴也有著顯著的缺點:1.遞迴由於是函式呼叫自身,而函式呼叫是有時間和空間的消耗:每一次函式呼叫都需要在記憶體棧中分配空間以儲存引數返回位址及臨時變數,壓棧出棧都需要時間,所以遞迴實現的效率不如迴圈好。2.遞迴中很多的運算可能是重複的。3.遞迴還存在乙個嚴重的問題那就是棧溢位,每一次函式呼叫都需要在記憶體棧上分配空間,當遞迴的層級過多時,就會出現超出容量,從而到導致棧溢位。

下面劍指offer面試題10、14、47、48都用遞迴分析問題並基於迴圈寫**。

/*面試題10:題目二:青蛙跳台階問題

乙隻青蛙一次可以跳上1級台階,也可以跳上2級台階,求該青蛙跳上n級的台階總共有多少種跳法。

分析:把n級台階時的跳法看成n的函式,記為法f(n),當n>2時,第一次跳的時候就有兩種,上1級後面剩下n-1級有f(n-1)種跳法

上2級後面剩下n-2級有f(n-2)種跳法

f(n)=f(n-1)+f(n-2),其實就是斐波那契數列

思路:1.在遞迴樹上會看到很多結點重複,並且重複的節點樹會隨著n的增大而增加,我們可以把得到的數列中間項儲存

2.從下往上算避免重複項o(n)

3.把斐波那契數列轉換成求矩陣的平方。

基於思路2,3寫了如下**。

*/# include# include int fibonacci2(int n)//把遞迴的演算法用迴圈實現

else if(n == 0)

else

return fibn; }}

#include struct matrix2by2//定義乙個矩陣

int m_00;

int m_01;

int m_10;

int m_11;

};matrix2by2 matrixmultiply(const matrix2by2& matrix1, const matrix2by2& matrix2)//矩陣的乘方

matrix2by2 matrixpower( int n)

else if(n % 2 == 0)//為偶數時

資料結構與演算法 遞迴

一 概念 遞迴是一種高效 簡介的編碼技巧,一種應用很廣泛的演算法,比如dfs深度優先搜尋,前中後序二叉樹遍歷等都是使用遞迴。方法或函式呼叫自身的方式成為遞迴呼叫,呼叫稱為遞,返回成為歸 所有遞迴問題都可以用遞迴公式來表示 二 遞迴優缺點 優點 簡潔 缺點 堆疊溢位風險 可根據調整遞迴呼叫的最大深度來...

筆試 資料結構之 遞迴和迴圈

如果我們需要重複地多次計算相同的問題,則通常可以選擇用遞迴或者迴圈兩種不同的方法。1 求斐波那契數列的第n項 f n 0 n 0 1 n 1 f n 1 f n 2 n 1 end right.f n 0 1f n 1 f n 2 n 0n 1n 1 2 乙隻青蛙一次可以跳上1級台階,也可以跳上2級...

資料 結構 遞迴

遞迴不一定非要像斐波拉契數列一樣在return中呼叫函式 遞迴的結束條件就是初始條件值 通常的方法將遞迴呼叫放在if語句中 n!通過遞迴實現 常用方法還是通過while實現 def jiecheng n if n 0 return 1 else sum n jiecheng n 1 右邊只有階乘表示...