演算法設計之遞迴

2021-10-25 14:39:14 字數 2601 閱讀 7254

先講個故事:

從前有座山,山里有座廟,廟裡有個老和尚,老和尚對小和尚說,從前有座山,山里有座廟,廟裡有個老和尚,老和尚對小和尚說,從前有座山…

其實這就是遞迴,所以我們每個人都聽說過。

定義:遞迴就是自己調自己。

思想:是把規模較大的乙個問題,分解成規模較小的多個子問題去解決,而每乙個子問題又可以繼續拆分成多個更小的子問題。 最重要的一點就是假設子問題已經解決了,現在要基於已經解決的子問題來解決當前問題;或者說,必須先解決子問題,再基於子問題來解決當前問題。

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 描敘 什麼是三角數...