河內之塔(漢諾塔)

題目

三個柱子 A、B、C。在A柱子從上到下 按照從小到大的順序放置64盤子,命令將全部的盤子從A柱子移至C柱子,而且搬運過程當中小盤子不能放在大盤子上面,且 在三根柱子之間一次只能移動一個盤子函數

clipboard.png

解題思路:

(1) 一個盤子 :spa

1: A--->Ccode

clipboard.png

clipboard.png

(2) 兩個盤子:
clipboard.png
clipboard.png遞歸

(3)三個盤子:ip

clipboard.png
clipboard.png

(4)四個盤子 :string

clipboard.png

clipboard.png

總結:

用n表示盤子總數it

(1)當只有一個盤子(n=1)的時候,直接從A到C;io

(2)當有兩個盤子(n=2)的時候,將第二根柱子B當作輔助柱,共三步;function

第一個盤子(n-1)從A到B,第二個盤子(n)從A到C,第一個盤子(n-1)從B到C。

clipboard.png

(3)當盤子個數超過2(你>2)個時,其實就是 經過 遞歸 處理兩個盤子(每次只走三步):(n-1)A—>B, (n)A-->C, (n-1)B-->C ;即:深度遍歷二叉樹class

clipboard.png

clipboard.png

js代碼:

//allSteps :用於存放移動的每一步驟
let allSteps=[];

/*
* 移動盤子的遞歸函數
* @param {number} n 當前處理的盤子
* @param {string} a , b ,c 表明當前的三根柱子
*/
function move(n,a,b,c){
  if(n===1){
    allSteps.push({
      n:n,
      from:a,
      to:c
    })
  }else{
    move(n-1,a,c,b);
    allSteps.push({
      n:n,
      from:a,
      to:c
    });
    move(n-1,b,a,c);
  }
}
相關文章
相關標籤/搜索