none
關於河內塔遊戲使用遞迴的疑惑 RRS feed

  • 一般討論

  • 目前在參考一些基礎設計原理的書  裡面提到了一個用遞迴設計河內塔(hanoi tower)遊戲的部份   這個遊戲就是 假設三根 A B C直立的木棒  A上面串有大中小三個盤子
    這三個棒子 分別 從A上面的 大中小的盤子 使用 這三根棒子  移動到 C ,最大的要在最下面,也就是說面積最大的必需在下  (不知道這樣子解說有沒有人能懂)    

    書上的範例是   C++
    # include<stdio.h>

    int number;    //計算移動次數  跟本堤解答無關@@

    void hanoi(int n, char a, char b, char c)

    {

    if(n>0)

    {

    hanoi(n-1,a,c,b); //把n-1張圓盤從a移動到b 

    printf("%02d : %C ->%C\n",number,a,c); //把最下面的圓盤從a移動到c

    hanoi(n-1,b,a,c); //把n-1張圓盤從b移動到c

    }

    }

    說真的 完全看不懂  雖然作者有說  他把系統切成三部份

    1.把最大的圓盤上面的兩片從A移動到B

    2.把最大的圓盤從A移動到C

    3.把剩下的圓盤從B移動到C 三部份進行遞迴

    可是我真的不懂他是怎麼運作的   另外請問有前輩能夠指導我  C# 遇到這種情況

    要讓它每個步驟都可以向初學者ㄧ樣觀察他的流程方式  是使用Messagebox.show 這個函數式嗎?   

    懇請前輩指導  小弟想了五天了 還是沒有辦法了解 在這個遞迴裡面  到底是怎麼去運轉的 

    謝謝各位~~

     

    2011年8月28日 上午 11:44

所有回覆

  • 1. 請愛用除錯器與中斷點,以逐步執行方式觀察程式變化。

    2. http://en.wikipedia.org/wiki/Tower_of_Hanoi 這裡有一張模擬的動畫圖可以看。


    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure
    2011年8月28日 上午 11:48
    版主
  • 小朱前輩   

     

    您再第一點的除錯器與中斷點 我目前還沒有學到

    請問是否能簡單指導晚輩一下  我也想學習一下 如何類似看流程那樣子  觀察程式跑的流程   因為這對思維真的很有幫助 

    動畫圖檔的部分我清楚了 可是如何使用遞迴 還是無法了解@@"

     

    2011年8月29日 上午 07:21
  • 完整的說明有專書介紹,書名為 程式除錯的奧秘 ,不過絕版了,可從圖書館裡借:

    http://www.google.com.tw/#hl=zh-TW&source=hp&q=%22%E7%A8%8B%E5%BC%8F%E9%99%A4%E9%8C%AF%E7%9A%84%E5%A5%A7%E7%A7%98%22&oq=%22%E7%A8%8B%E5%BC%8F%E9%99%A4%E9%8C%AF%E7%9A%84%E5%A5%A7%E7%A7%98%22&aq=f

     

    如果只是要看熱鍵跟簡單的說明,這篇可以看一下:

    http://tlcheng.twbbs.org/TLCheng/Fortran/MSF4/fdebug.htm

     

    這個功能微軟從 DOS PWB 開始到現在,可回溯到 Quick Basic 4.0 / Microsoft C 5.0 以前版本。

    註:Microsoft C/C++ 7.0 以後才是 VC 1.0 ,現在 VS2010 版號是承接 VC 1.0 版號延續下來的。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年8月29日 上午 09:42
  • 補充:

    河內塔部分最好先看過演算法,雖然逐步追蹤可以看程式怎樣跑,但是先看過理論或演算法才真正知道原始設計為河。

    從除厝模式的程式碼去反推演算法或是理論其實很辛苦,通常是理論掌握了,檢查程式碼為何與理論不同用的,當然也可以用在已經初步了解演算法後,看程式碼執行做進一步確認,這種情況僅適用在小命題,否則一個大迴圈跑下去,看的人也要瘋了~


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年8月29日 上午 09:46
  • 我倒是覺得, 拿筆和紙自己模擬電腦流程可能會比看電腦跑更清楚.
    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年8月29日 下午 03:04
    版主