zoukankan      html  css  js  c++  java
  • 汉诺塔

    汉诺塔—理解递归

    如下图所示,从左到右有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)
  • 相关阅读:
    准备ing
    六月的最后一星期
    对象及其内存管理 笔记
    数组及其内存管理 笔记
    笔记
    搜狐 云端服务组实习面试小记
    leetcode之Binary Tree Level Order Traversal
    数据库01-范式总结
    Tour UVa 1347 (DAG)
    Directed Acyclic Graph DAG(有向无环图)上的DP
  • 原文地址:https://www.cnblogs.com/chunzhulovefeiyue/p/8505882.html
Copyright © 2011-2022 走看看