不走心的c 復建 遞迴與迴圈

2021-10-08 12:07:37 字數 1321 閱讀 2783

1. 遞迴演算法

如果乙個問題需要重複多次計算相同的問題,通常可以考慮使用遞迴進行求解。換句話說,當乙個問題可以分解為多個子問題,而這些子問題的求解方式相同,那麼這個問題就可以使用遞迴進行解決。遞迴通過在乙個函式的內部呼叫這個函式自身,經典的問題是fibonacci序列的計算問題:

問題描述:寫乙個函式,輸入n

nn,求fibonacci序列的第n

nn項。fibonacci序列的定義如下:

f (n

)=

0, n=0 \\ 1, n=1 \\ f(n-1)+f(n-2), else \end

f(n)=⎩

⎪⎨⎪⎧

​0,n

=01,

n=1f

(n−1

)+f(

n−2)

,els

e​根據上式中的推導公式,可以很輕易地寫出如下的**。

// fibanacci array: f(n) = f(n-1) + f(n-2), f(0) = 0, f(1) = 1

int fibobacci(int n)

2. 迴圈

在上節中提過,遞迴適用於該問題可以分解為多個子問題的場景。然而,當這些子問題之間互相有重疊的部分——某個子問題的解依賴於其他子問題的解,使用遞迴演算法進行求解時會進行大量重複的運算,造成計算資源的浪費。此時,該問題便不再適合使用遞迴進行求解。遞迴和迴圈的使用場景可以使用如下的方式進行總結:

if (子問題的求解不依賴於其他子問題)

return 遞迴;

if (子問題依賴於其他子問題的解)

return 將遞迴演算法轉變為迴圈的方式;

遞迴演算法往往採用由上往下的思考方式來解決問題,這樣的方式容易對問題進行建模,即列出推導公式。在列出推導公式之後,再使用迴圈的實現方式由下往上地進行解決,即可以避免重複計算,也可以很容易地計算目標的函式f(n

)f(n)

f(n)

。fibonacci問題可以先計算f(0

),f(

1),f

(2

)f(0), f(1), f(2)

f(0),f

(1),

f(2)

,依據子問題間的關係可以輕易計算出f(n

)f(n)

f(n)

,**如下。

int fibonacci(int n)

return res;

}

遞迴與尾遞迴的迴圈實現

程式呼叫自身的行為稱為遞迴,是函式自己呼叫自己。乙個函式在其定義中直接或間接呼叫自身的一種方法,它通常把乙個大型的複雜的問題轉化為乙個與原問題相似的規模較小的問題來解決,可以極大的減少 量,遞迴的能力在於用有限的語句來定義物件的無限集合。遞迴的思想是把問題分解成為規模更小且與原問題有著相同解法的問題...

迴圈與遞迴的區別

迴圈與遞迴的區別 helloword 迴圈 迭代 與遞迴的區別 1。遞迴演算法與迭代演算法的設計思路區別在於 函式或演算法是否具備收斂性,當且僅當乙個演算法存在預期的收斂效果時,採用遞迴演算法才是可行的,否則,就不能使用遞迴演算法。當然,從理論上說,所有的遞迴函式都可以轉換為迭代函式,反之亦然,然而...

迴圈與遞迴的區別

迴圈 迭代 與遞迴的區別 1。遞迴演算法與迭代演算法的設計思路區別在於 函式或演算法是否具備收斂性,當且僅當乙個演算法存在預期的收斂效果時,採用遞迴演算法才是可行的,否則,就不能使用遞迴演算法。當然,從理論上說,所有的遞迴函式都可以轉換為迭代函式,反之亦然,然而代價通常都是比較高的。但從演算法結構來...