感悟神奇的遞迴

2021-08-17 20:57:25 字數 1647 閱讀 7258

關於遞迴,我們高中數學就有接觸,教材中是這樣定義的:當乙個函式用自身來定義時就稱為遞迴。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...