图解汉诺塔(满屏幕都是图)
生活随笔
收集整理的這篇文章主要介紹了
图解汉诺塔(满屏幕都是图)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
圖解漢諾塔(滿屏幕都是圖)
- 漢諾塔問題
- 步驟1:
- 步驟2
- 步驟3:
- 技術總結
和很多人一樣,我剛剛接觸漢諾塔的時候,可能說是頭暈目眩,立馬放棄。
但如果用圖形表示感覺會好很多。
以下是我的學習思路:
漢諾塔問題
首先。遞歸的思路是什么?
把復雜的問題簡單化
這里有四層塔,我們要在大塔不壓小塔的情況下,把塔從x移動到z。(靈魂手繪看得懂就行)
f(n,x,y,z)f(n,x,y,z)f(n,x,y,z)
其中
nnn—漢諾塔層數
xxx—x軸
yyy—y軸
zzz—z軸
這個函數的功能是把n層漢諾塔從x移動到z,且中間要通過y。(當然這里的x、y、z都是形參,你傳入什么就是什么,不代表圖中的軸)
本著把復雜問題簡單化的原則,每一個步驟都用一條語句實現。
步驟1:
這里我們把n-1從x移動到了y上,當然我們不能同時移動這么多層,所以形成這一局面一定要通過z。(是不是很熟悉,你想到了什么?……函數,是不是,可以返回去看看) 這里寫出函數: 好的你完成了第一步。步驟2
現在你可以愉快的把x軸上的一層塔移動到z軸上了!
步驟3:
把y軸上的n-1層塔移動到z軸上,通過x軸。
大功告成!什么?沒看懂!不著急,下面開始技術總結:
技術總結
當然有一種例外情況(也是遞歸出口),當n=1時,可以直接從x軸移動到z軸。
現在我們可以開始設計函數了:好的現在開始寫程序(我用的是c,函數名稱叫:hanota)
#include <stdio.h> void hanota(int n, char x, char y, char z) {if (n == 1){printf("%c --> %c\n", x, z);}else{hanota(n - 1, x, z, y);hanota(1, x, y, z);hanota(n - 1, y, x, z);} }int main(void) {char x ='x';char y ='y';char z ='z';int n = 4;hanota(n, x, y, z);} /* 結果輸出: x --> y x --> z y --> z x --> y z --> x z --> y x --> y x --> z y --> z y --> x z --> x y --> z x --> y x --> z y --> z*/總結
以上是生活随笔為你收集整理的图解汉诺塔(满屏幕都是图)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: swing打地鼠游戏_你还记得那个超级玛
- 下一篇: java pdf模板_java通过PDF