摘要:汉诺塔问题描述有三个圆柱,其中上从上至下放置了从小到大个圆盘,一次只能移动一个圆盘,且大的圆盘不能放在小圆盘之上,要求打印出从将圆盘移到的方案。
汉诺塔问题描述:有A, B, C三个圆柱,其中A上从上至下放置了从小到大n个圆盘,一次只能移动一个圆盘,且大的圆盘不能放在小圆盘之上,要求打印出从A将圆盘移到C的方案。
当n = 1时, A->C
当n = 2时, A->B, A->C, B->C
当n = 3时, [A->C, A->B, C->B,] A->C,[B->A, B->C, A->C]
当n = 4时, A->B, A->C, B->C, A->B, C->A, C->B, A->B,
A->C, B->C, B->A, C->A, B->C, A->B, A->C, B->C
当n = 5时, A->C, A->B, C->B, A->C, B->A, B->C, A->C,
A->B, C->B, C->A, B->A, C->B, A->C, A->B, C->B A->C, B->A, B->C, A->C, B->A, C->B, C->A, B->A, B->C, A->C, A->B, C->B, A->C, B->A, B->C, A->C
当n > 2时,第n项,[A->B],A->C,[B->C]
第n-1项,A->B [A->C],A->B,[C->B] B->C [B->A],B->C,[A->C] 第n-1-1项, 第n-1项,A->C(此处的C应该是B),A->C,和第n-1-1项,A->B(此处的B应是C),B->C …… 如此重复,可以用递归求得结果
由此,不难看出,计算n个圆盘,所需要的次数为f(n) = 2*f(n-1)+1
代码:
const move=(a,c)=>{ console.info(`${a}->${c}`) } const hanoi = (n,a,b,c)=>{ if(n === 1){ move(a,c) }else{ //[A->B] hanoi(n-1,a,c,b); move(a,c); //[B->C] hanoi(n-1,b,a,c); } }
参考:从fibonacci和汉诺塔看分治法
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/88905.html
摘要:应用分治法是一种很重要的算法。字面上的解释是分而治之,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。 ...
摘要:汉诺塔问题有三根柱子,源杆,暂存杆,目的杆上有层盘子,由小到大向下排列,现需要将杆的盘子移到杆中要求大的盘在下面,小的盘在上面一次只能移动一个盘子个人思路先分析问题,用数学的归纳法当只有一个盘时,直接移动当有两个盘时,先将小的移到暂存杆,再 汉诺塔问题: 有三根柱子,源杆A,暂存杆temp,目的杆C A上有n层盘子,由小到大向下排列,现需要将A杆的盘子移到C杆中 ...
阅读 881·2021-11-23 09:51
阅读 1088·2021-11-15 17:57
阅读 1666·2021-09-22 15:24
阅读 811·2021-09-07 09:59
阅读 2221·2019-08-29 15:10
阅读 1848·2019-08-29 12:47
阅读 751·2019-08-29 12:30
阅读 3368·2019-08-26 13:51