漢諾塔演算法演示1.0

wenzi0_0發表於2014-07-10

  工作之餘閒來無聊,於是就有了用JS來實現演算法演示的想法,很久以前用JS實現過選擇排序,不過源程式找不到了!

  漢諾塔的遞迴演算法:

void move(int n,char a,char b,char c)
{
    if(n==1)
        printf("\t%c->%c\n",a,c);    //當n只有1個的時候直接從a移動到c
    else
    {
        move(n-1,a,c,b);            //第n-1個要從a通過c移動到b
        printf("\t%c->%c\n",a,c);
        move(n-1,b,a,c);            //n-1個移動過來之後b變開始盤,b通過a移動到c,這邊很難理解
    }
}

  在上面的遞迴演算法中,printf函式可以換成我們JS的動畫處理函式。我也是受到了其他人寫的漢諾塔演算法演示的啟發:先在演算法執行完成以後, 才開始執行動畫效果。

  【程式碼演示

  在程式碼中

  在init()這個方法裡我們可以看

// 初始化
Hnt.init = function(opt){
    $("#block").html('');

    Hnt.movie = [];

    Hnt.options = $.extend(Hnt.options, opt);
    Hnt.A.num    = Hnt.options.n;
    Hnt.B.num    = 0;
    Hnt.C.num    = 0;

    Hnt.initBlock(Hnt.options.n);
    Hnt.move(Hnt.options.n, "A", "B", "C");
    Hnt.start();
}

  前半部分是將使用到變數重新初始化。

  後半部分:

  initBlock();  // 初始化盤子

  move();    // 漢諾塔演算法的執行,僅僅是執行演算法,在這個過程中儲存盤子移動的路徑,但是不執行動畫

  start();      // 執行動畫效果。

 

  ======================================================

  後話:現在僅僅是用js簡單地實現了漢諾塔的演示過程,下一步打算從流程上和介面上進行優化,也希望能夠學習一些其他的東西。比如:html5的dnd,audio,woker,localstorage,還有jQueryMobile的框架

相關文章