專題 遞推遞迴演算法 including 斐波那契

2021-08-28 17:46:36 字數 2121 閱讀 3109

初見安~講深搜前我們先講講遞迴:)

遞推,顧名思義就是根據已有的推出未知的。很簡單,斐波那契數列就是乙個很典型的例子:

那我們就以此作為例題看看吧:

要求輸入:乙個整數n

輸出:斐波那契數列的第n個數。

斐波那契數列的規律也顯而易見:第n個數的值為第n-1個數和第n-2個數的和。

這道題的遞推操作的實現,我們可以用到for迴圈:

#include

using namespace std;

intmain()

cout<

;//輸出

return0;

}

所以遞推是很好理解的:)

遞迴其實是乙個比較大的思想了。它和遞推的區別就在於:遞推是根據乙個公式往前推過去,而遞迴則是層層深入,直到邊界後再返回。相當於多了乙個回溯的過程。

實現遞迴,我們需要自己定義函式並自身呼叫,即程式巢狀。

這是什麼意思呢?可能有點難理解。簡單舉個例題吧:

求2的x次方。

要求輸入:乙個整數x

要求輸出:2的x次方

很簡單的一道題——相信你第一反應是可以用for迴圈來做。為了理解,我們用遞迴實現試試。

先寫好框架吧:

#include

using namespace std;

intmain()

接下來寫自己定義的函式:

void是指無返回值的函式。

void

digui

(int i)

//前文主函式裡的x傳送到這裡,作為變數i——剩下的次方數。

如果就這樣了的話,編譯器會告訴你各種沒有定義的錯誤。

首先是void digui(int i)沒有定義。c++在編譯過程中,會有個從上到下的順序,但也會先訪問主函式int main();但在主函式中遇到了乙個自定義的函式,就會去查詢——在主函式之前去找。所以我們要把digui定義在主函式前面。

其次就是ans未定義。這裡我們主函式裡定義了,為什麼在自定義函式裡又說沒有定義了?因為就如同上方自定義函式裡的int i一樣,在**定義,就只能在**用。所以int main裡的ans只能在主函式裡呼叫,在digui裡不曾定義。若為了方便,可以定義全域性變數——在主函式外定義。標城如下:

#include

using namespace std;

int x,ans=1;

//全域性變數

void

digui

(int i)

intmain()

這樣我們得到的就是2的x次方了:)

如果有興趣的話,求x的y次方有乙個專門的函式:pow(int x ,int y)。有一道題叫做快速冪,是這一方法的乙個優化,也可以了解一下。畢竟這樣算資料量一旦大了就很容易超時(很久才出結果)。

這一應用上,我們可以發現:遞迴實現的自我呼叫其實可以用for迴圈實現。簡單的遞迴也都的確如此,類似於逆序輸出也可以用for迴圈逆序下標輸出。

我們再來看乙個遞迴的應用:

已知:

不要覺得你可以手算:)根號這種無理數只能用夾逼法算是很痛苦的。

這道題也很明顯的用遞迴,向自己定義的函式傳資料兩次就可以了。

由這一公式我們也可以化簡為我們的遞推式:

所以我們可以開始敲**了:

p.s:sqrt(int x)為#include中的標準函式,求x的平方根

#include

#include

using namespace std;

double

digui

(int x,

int n)

intmain()

有沒有突然覺得遞迴很方便呢~這個思想是很簡單的,而難在運用。比如我們下文將講述的——深度優先搜尋(dfs)。

迎評:)

——end——

遞推遞迴專題總結

這個專題的題目比較少,但是還是沒能做完,我感到很殘酷,好多人都做完了我卻沒有,因為後面幾道我感覺很難,這個專題的題目給我的感覺就是用 來表達數學,只要找到了題目中的規律,題目就會變得很簡單,否則很難做出來。這個專題給我感受最深的是馬攔過河卒那道,那道題很好理解,但是我沒能做出來,就是因為沒能找到其中...

遞迴遞推練習專題總結

遞推遞迴是比較重要的一部分內容,但有些問題理解起來比較抽象。最主要最困難的就是找到關係式,一旦找到關係式用 實現起來就非常簡潔了。遇到遞迴遞推的題目,要先明確用遞迴遞推的方法來解題否則用其它方式將更為繁瑣。還有就是預處理,在很多遞推的題目中用預處理,能大大節省時間和空間。遞迴一般經常用函式來實現,通...

遞推遞迴專題 G 考四級

1 簡單描述 多次輸入測試,輸入一排座位數,兩個人之間至少空兩個座位,共有多少種坐法。2 思路 找遞推公式,假設共n個座位,有兩種情況,第n個座位坐人和第n個座位不坐人,當第n個座位不坐人時,情況與有n 3個座位時情況相同 當第n個座位不坐人時,第n 1個座位和第n 2個座位可為0 1或者1 0,只...