码迷,mamicode.com
首页 > 其他好文 > 详细

汉诺塔

时间:2018-03-04 21:24:28      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:mes   好的   一个   end   最大的   gif   epo   有一个   hub   

汉诺塔—理解递归

如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤

技术分享图片

Code

#include <iostream>
using namespace std;


void move(char A, char C)
{
    cout << "move a plate from " << A << " to " << C << endl;
}
/*
 * 将A中n个圆盘,借助B,全部移动到C中
 */
void hanoi(int n, char A, char B, char C)
{
    if(n == 1)
        move(A, C);
    else
    {
        //先将n-1个盘子从A上借助C移动到B
        hanoi(n-1, A, C, B);
        //再将1个(最大的盘子)从A直接移动到C
        hanoi(1, A, B, C);  //代码等同于move(A,C);
        //再将n-1个盘子从B借助A移动到C
        hanoi(n-1, B, A, C);
    }

}

int main()
{
    char A = ‘A‘;
    char B = ‘B‘;
    char C = ‘C‘;
    int n = 3;
    hanoi(n, A, B, C);
}

最终的输出为

move a plate from A to C
move a plate from A to B
move a plate from C to B
move a plate from A to C
move a plate from B to A
move a plate from B to C
move a plate from A to C

借助知乎上的一个动图能够更好的理解。

技术分享图片

此外,不难发现一个规律

  • 当n=1时,只需要移动1次
  • 当n=2时,需要移动3次
  • 当n=3时,需要移动7次
  • 当n=4时,需要移动15次
  • ……
  • 依此类推,当n = m时,需要移动 \(2^{m} - 1\)

汉诺塔

标签:mes   好的   一个   end   最大的   gif   epo   有一个   hub   

原文地址:https://www.cnblogs.com/chunzhulovefeiyue/p/8505882.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!