遞迴 Hanoi塔問題

2021-07-11 03:54:48 字數 893 閱讀 2776

題目:

hanoi塔問題,遊戲規則:(1). 每次只能移動乙隻圓盤 (2). 任何時候大圓盤不能壓在小圓盤之上 (3). 任何時候都不允許將圓盤放在三根立軸之外的任何地方。

分析:遞迴的 base case:

當只有乙個圓盤的時候,直接從圓盤所在的立軸移動到目標立軸,即完成。

遞迴的 recursion rule:

如圖所示,要將n個圓盤從立軸a移動到立軸c,需要三步:

(1). 將最上面的 n-1 個圓盤從立軸a移動到立軸b;

(2). 將最大(最下面)的圓盤從立軸a移動到立軸c;

(3). 「迭代" (1)和(2),將 n-1 個圓盤從立軸b移動到立軸c;

通過分析,可以看出,步驟(2) 是乙個單元步驟,步驟(1)和(3)都是總問題(將n個圓盤從乙個立軸移到另乙個立軸)的子問題(將n-1個圓盤從乙個立軸移動到另乙個立軸)。

遞迴函式的引數:

遞迴函式需要4個引數:第乙個引數為圓盤個數n,第

二、三、四個引數分別為三個立軸的名稱。

**:

public static void hanoi(int n, char from, char use, char to) 

hanoi(n-1, from, to, use);

system.out.println("move " + from + " to " + to);

hanoi(n-1, use, from, to);

}

這道題的 base case 可以併入到 recursion rule 中,**可以簡化為:

public static void hanoi(int n, char from, char use, char to) 

}

hanoi塔問題(遞迴問題)

hanoi塔問題是比較經典的遞迴問題,很多學生從大一開始學習c語言遞迴時都或許會碰到這個問題,但很多同學一開始都是一知半解的,現在我來領大家一起重新學習一下hanoi問題,讓我們一起對遞迴函式有更好的理解。設n為hanoi塔的盤子的數量。a,b,c是三根支柱,hanoi 函式要求將所有的盤從a借助b...

漢諾塔問題 hanoi(遞迴)

漢諾塔問題 hanoi 現有abc三個柱子,a中有n個盤 上小下大 移動到c上,要求全程上小下大 演算法 遞迴,把1 n 1個盤當作乙個整體 include 函式宣告 函式功能 把n個盤 從a 借助b,移到c hanoi int n,char x,char y,char z 函式功能 把乙個盤子x ...

hanoi塔問題的遞迴實現

一 背景故事 二 問題描述 假設有x,y,z三座塔座。在塔座x上有n個直徑各不相同 依次從小到大的編號為1,2.n的圓盤。現要求將x座上的盤子移動到z上,移動要求如下 1 一次只能移動乙個盤子。2 盤子只能插在x,y,z的某個塔座上。3 任何時刻不能將較大的盤子壓在較小的盤子上。如何移動盤子呢?當只...