關於遞迴,我們高中數學就有接觸,教材中是這樣定義的:當乙個函式用自身來定義時就稱為遞迴。c++允許函式是遞迴的,但必須要記住,c++所做的僅僅是試圖遵循遞迴思想,不是所有的數學遞迴函式都能被有效的c++的遞迴模擬來實現。要點在於,遞迴函式應該像非遞迴函式一樣只用幾行就能表示出來[1]。例如:
int f(int x)
#include
unsigned
int sum(unsigned
int n)
else
}int main()
b、斐波那契數列
數列自身遞迴定義:1,1,2,3,5,8,13,21…
函式表示遞迴:
fac(n) =
if((n == 2) || (n == 1))
return0;}
int main()
return
0;}c、用遞迴方法編寫函式求字串的長度
c++具體**
#include
unsigned
int _strlen_(char *s) //避免與庫函式重名
if(*s == '\0')
return
0; //上述**的另一種寫法:return s ? (*s ? (1 + _strlen_(s+1)) : 0) : 0;
}int main()
上述三個示例的結果如圖:
注意事項:
解決問題的核心是如何建立遞迴模型,注意切勿陷入遞迴函式的執行細節上,學會通過程式描述問題,還要注意遞迴解法必須有出口,也即邊界,否則無解。出口的概念我們可以這樣解釋:總有某些基準的情形,它們不用遞迴就能求解。還有乙個準則需要注意,對於那些要被求解的情形,遞迴呼叫必須總能夠朝著乙個基準推進。
我們來看看有趣的漢諾塔問題
實現**:
#include
using
namespace
std;
void hanoitower(int n, char a, char b, char c)
else
}//測試
int main()
方案如下圖:
這裡面的a、b、c分別代表三個柱子,箭頭表示木塊移動的方向。以3層塔的實驗結果與手推一致,更多層塔等你去試哦!
參考文獻
[1] mark allen weiss,data structures and algorithm analysis in c++ third edition,2011.08
inline void 樹狀陣列神奇感悟 霧
才發現掃瞄線可以用樹狀陣列搞.致遠星患者 另外根據這篇博文的內容怎麼越來越感覺自己往 pj 入門靠攏了.還有一點,咱把樹狀陣列當做線段樹來康的話其實一切都會很清晰,這個來張四合一的圖 第一張就是隨處可見的 sb 樹狀陣列剖析圖了 第二張咱把點補齊了一下,即每個點下面所有層都賦值乙份點,然後以第一張圖...
百煉2755 神奇的口袋(遞迴)
有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a 1,a 2 a n。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,john就可以得到這些物品。現在的問題是,j...
演算法筆記4 3遞迴 神奇的口袋
有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a1,a2 an。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,john就可以得到這些物品。現在的問題是,john...