
游戏目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。
操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
人类思维
当盘子较少时可以自己画图模拟演算,但是盘子过多了脑袋就不够用了。
数学思维
归纳公式
我们需要将n个盘从A挪到C,那么一定满足以下几个步骤:
- 将n-1个盘先从A挪到B;
- 再将最大的盘从A挪到C;
- 最后将在B的n-1个盘挪回C。
按照上面的步骤,我们可以用h(n,A,B,C)来表示挪动过程,意思是将A中n个盘从A挪到C(中间的B无意义)。
根据归纳法很容易得到以下公式:
转公式为代码
“看图写话”
const h = (n, from, cache, to) => {if (n === 1) return `${from}${to}\n`;return h(n-1,from, to, cache) + `${from}${to}\n` + h(n-1, cache, from ,to) + '\n'}
优化后
const h1 = (n, from, cache, to) => n === 1? `${from}${to}\n`: h1(n-1,from, to, cache) + `${from}${to}\n` + h1(n-1, cache, from ,to) + '\n'
总结
从汉罗塔问题我们很容易看到数学思维的魅力,并没有很“懂”,却三下两下把问题解决了~
