在定義乙個過程或函式時,出現呼叫本過程或本函式的成分稱為遞迴
如果乙個遞迴過程或函式中的遞迴呼叫語句是最後一條執行語句,則稱這種遞迴呼叫為尾遞迴
例如:計算階乘函式
intf(
int n)
else
return(f
(n-1
)*n)
;}
遞迴解決問題應滿足三個條件
需要解決的問題可以轉化為乙個或多個子問題求解,而這些子問題的求解方法與原問題相同,只是數量規模上不同
遞迴呼叫次數必須是有限
必須要結束條件終止遞迴
遞迴優點:結構簡單、清晰、方便證明準確性
遞迴缺點:占用記憶體多,執行效率低、不容易優化
定義是遞迴的:許多數學公式、定義是遞迴時。例:階乘、fibonacci數列等
資料結構是遞迴的:例:單鏈表、樹等
typedef
struct lnodelinknode;
//結構體lnode的宣告用到了它本身
//利用遞迴方式求單鏈表所有data域的和
intsum
(linknode *l)
else
return
(l->data+
sum(l->next));
}
問題的求解方式是遞迴的:hanoi問題
漢諾塔問題的規則在此不再贅述
設hanoi(n,x,y,z)表示將n個碟片從x軸,經由y軸,移動到z軸
我們可以將其拆分為三步進行(找到遞迴公式)
第一步:將x軸上 n-1 個碟片經由 z軸 移動到 y軸
第二步:將x軸上最後乙個碟片直接移動到 z軸
第三步:將y軸上 n-1 個碟片經由 x軸 移動到 z軸
那麼問題是:我們如何完成第一步和第三步呢?
其實第一步和第三步又可以分別拆分為上述三個步驟(遞迴公式)
遞迴出口:當只有乙個碟片時,可以將它直接移動。
**實現
#include
//漢諾塔
emmm,我的語言表達能力更進一步描述清楚
你可以手動執行一次函式,一定要注意形參和實參,通過乙個棧模擬,便可以理解了!
順便貼一下漢諾塔問題的非遞迴寫法
總結:在面對遞迴問題時,找到遞迴公式,遞迴出口是關鍵
遞迴入門(漢諾塔問題)
遞迴是演算法課中最重要的一門必修課,也是我們繞不開的坎,寫這篇文章的目的主要是以練代學,一步一步理解遞迴,形成肌肉記憶 有很多理論性的文章,教你如何理解遞迴,看完之後還是很懵逼,最初我學遞迴的時候直接是從入門到放棄,然後打算直接刷題,在題量的累積下,頓悟了 概念上的東西不解釋太多,簡單說一下就是,有...
C語言遞迴 (漢諾塔問題)
漢諾塔 tower of hanoi 又稱河內塔,是乙個源於印度古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序 摞著64片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另 一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能...
C語言遞迴實現漢諾塔問題
剛剛學習漢諾塔問題想要快速上手的話也可以理解為由三個柱構成 具體到函式裡下面的注釋裡有寫。在使用遞迴前我們首先要知道什麼是遞迴 程式呼叫自身的程式設計技巧稱為遞迴 recursion 遞迴的作用 遞迴做為一種演算法在程式語言中廣泛應用。乙個過程或函式在其定義或說明中有直接或間接呼叫自身的一種方法,它...