初見安~講深搜前我們先講講遞迴:)
遞推,顧名思義就是根據已有的推出未知的。很簡單,斐波那契數列就是乙個很典型的例子:
那我們就以此作為例題看看吧:
要求輸入:乙個整數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,只...