image.png
游戏目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。
操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

人类思维

当盘子较少时可以自己画图模拟演算,但是盘子过多了脑袋就不够用了。

数学思维

归纳公式

我们需要将n个盘从A挪到C,那么一定满足以下几个步骤:

  1. 将n-1个盘先从A挪到B;
  2. 再将最大的盘从A挪到C;
  3. 最后将在B的n-1个盘挪回C。

按照上面的步骤,我们可以用h(n,A,B,C)来表示挪动过程,意思是将A中n个盘从A挪到C(中间的B无意义)。

从汉罗塔问题了解数学思维的魅力 - 图2

根据归纳法很容易得到以下公式

从汉罗塔问题了解数学思维的魅力 - 图3

转公式为代码

“看图写话”

  1. const h = (n, from, cache, to) => {
  2. if (n === 1) return `${from}${to}\n`;
  3. return h(n-1,from, to, cache) + `${from}${to}\n` + h(n-1, cache, from ,to) + '\n'
  4. }

优化后

  1. const h1 = (n, from, cache, to) => n === 1
  2. ? `${from}${to}\n`
  3. : h1(n-1,from, to, cache) + `${from}${to}\n` + h1(n-1, cache, from ,to) + '\n'

总结

从汉罗塔问题我们很容易看到数学思维的魅力,并没有很“懂”,却三下两下把问题解决了~