先講個故事:
從前有座山,山里有座廟,廟裡有個老和尚,老和尚對小和尚說,從前有座山,山里有座廟,廟裡有個老和尚,老和尚對小和尚說,從前有座山…
其實這就是遞迴,所以我們每個人都聽說過。
定義:遞迴就是自己調自己。
思想:是把規模較大的乙個問題,分解成規模較小的多個子問題去解決,而每乙個子問題又可以繼續拆分成多個更小的子問題。 最重要的一點就是假設子問題已經解決了,現在要基於已經解決的子問題來解決當前問題;或者說,必須先解決子問題,再基於子問題來解決當前問題。
a依賴於b,b依賴於c,c依賴於d……
當d解決了那c就解決了,b解決了a就解決了。
則有:n = 1,sum = 1
n = 2,sum = 21
n = 3,sum = 321
n = 4,sum = 4321
n = 5,sum = 54321
int getsum (
int n)
else
}
結果:
通過大量的例子總結出遞迴需要注意一下幾點:
第一遞迴函式功能
比如在這個函式中,功能就是求階乘。
找出遞迴結束的條件
比如在這個函式中,遞迴終止條件就是n=0,n=1
找出函式的等價關係式
比如在這個函式中等價關係就是getsum(n) = n*getsum(n-1)
理解遞迴就是要多練習,多做題。
斐波那契數列的是這樣乙個數列:1、1、2、3、5、8、13、21、34…,即第一項 f(1) = 1,第二項 f(2) = 1…,第 n 專案為 f(n) = f(n-1) + f(n-2)。求第 n 項的值是多少。
函式如下:
乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法。
分析:如果n=1,只有一種跳法,那就是1
如果n=2,那麼有兩種跳法,2,[1,1]
如果n=3,那麼有三種跳法,[1,1,1],[1,2],[2,1]
如果n=4,那麼有五種跳法,[1,1,1,1],[1,1,2],[1,2,1],[2,1,1],[2,2]
如果n=5,那麼有八種跳法,[1,1,1,1,1],[1,1,1,2],[1,1,2,1],[1,2,1,1],[2,1,1,1],[2,2,1],[2,1,2],[1,2,2]
結果為1,2,3,5,8 這他媽不就是斐波那契數列嘛
下面看看**
現在有n個圓盤從上往下從小到大疊在第一根柱子上,要把這些圓盤全部移動到第三根柱子要怎麼移動呢?請找出需要步驟數最少的方案。
因此我們可以將問題簡化描述為:n個盤子和3根柱子:a(源)、b(備用)、c(目的),盤子的大小不同且中間有一孔,可以將盤子「串」在柱子上,每個盤子只能放在比它大的盤子上面。起初,所有盤子在a柱上,問題是將盤子乙個乙個地從a柱子移動到c柱子。移動過程中,可以使用b柱,但盤子也只能放在比它大的盤子上面。
因此我們得出漢諾塔問題的以下幾個限制條件:
1.在小圓盤上不能放大圓盤。
2.在三根柱子之間一回只能移動乙個圓盤。
3.只能移動在最頂端的圓盤。
首先,我們從簡單的例子開始分析,然後再總結出一般規律。
當n = 1的時候,即此時只有乙個盤子,那麼直接將其移動至c即可。移動過程就是 a -> c
其它情況可自行推演。
下面搞個圖加深個印象:
//過渡柱不是固定的噢。
void
hanluota
(int ncounts,
char a,
char b,
char c)
else
}int
main()
執行結果:
我相信通過這些例子你應該對它有個初步的認識。
演算法設計與分析之遞迴演算法練習(下)
遞迴演算法九 整數劃分問題 遞迴演算法十 排隊購票 遞迴演算法十一 楊輝三角 遞迴演算法十二 計算兩個數的最大公約數 遞迴演算法十三 計算乙個正整數中所有的數字之和 遞迴演算法十四 求 1 1 2 1 3 1 n 的和 本部落格其他文章推薦 當n 1時,perm r r 其中r是集合r中唯一的元素 ...
演算法之遞迴
自從學了c語言,遞迴不得解。自淺學習演算法,遞迴得已解。很多書上都這麼寫的,遞迴 就是間接呼叫自己或直接呼叫自己的過程叫遞迴。話的確沒錯,初見還是較難理解,所以一般會給乙個斐波那契數列什麼的作為經典案例,不得不說我當初看的時候四個字 頭皮發麻 後來慢慢接觸多了,也不覺得如何。所謂遞迴 就是呼叫自己,...
演算法之 遞迴
遞迴在程式語言中簡單的理解是 方法自己呼叫自己 描敘遞迴就是自己呼叫自己,不過需要注意的地方,需要給定跳出條件 示例 1 簡單遞迴 public class test1 public static void fa int i system.out.println i fa i 1 描敘 什麼是三角數...