递归之二(汉诺塔游戏)

说到汉诺塔游戏,是我最近才听说的一个游戏!(原谅我的无知...)

游戏规则是这样的:

有 x , y ,z  三根针,要求把 x 上的 3 个盒子放到 z 上

1. 小盒子只能放在大盒子上边 

2. 一次只能搬运一个盒子

 那么我们很容易可以得出步骤应该是这样的

x ==> z

x ==> y

z ==> y

x ==> z

y ==> x

y ==> z

x ==> z

ok,我前边说过递归一定含有微弱的耦合性,那么想要写递归一定要先找它们的共同点

废话不多说,直接贴代码吧!

function hanoi_ (n, x, y, z) {
  if (n === 1) {
    console.log(x + ' ==> ' + z)
  } else {
    hanoi_(n - 1, x, z, y)
    console.log(x + ' ==> ' + z)
    hanoi_(n - 1, y, x, z)
  }
}

hanoi_(3, 'X', 'Y', 'Z')

好,相信很多人目前都看不懂这个原理吧!更别说写出来了。

那么我们就先讲一下这个函数的原理,再说说写这个函数的人当初到底是什么样的思路呢?难道真的是天才?

爱迪生说过,天才就是 99% 的汗水加上 1% 的灵感。(下一句自己查百度)

那么其实这 99% 的汗水一定是为那 1% 的灵感而流的。

这个函数其实很简单。单从函数角度讲是这样的

如果只有一个盒子那我只需要把当前盒子放到 z 上。

如果有 n 个盒子,那我就需要把 n-1 个盒子先放到 y 上,

然后才能把最后一个盒子也就是 n 放到 z 上,

最后把 n-1 个盒子 又从 y 移动到 z 上。

ok,本人暂时有事,先写到这里了,有时间再继续写。... 抱歉(聪明的人都喜欢自己分析)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章