zoukankan      html  css  js  c++  java
  • 关于Hanoi的递归分析

    先上Hanoi的递归代码:

    #include <iostream>
    
    using namespace std;
    
    void Hanoi(int n,char x,char y,char z) {
        if(n == 1)
            printf("将盘片%d从%c搬到%c
    ",n,x,z);
        else {
            Hanoi(n-1,x,z,y);
            printf("将盘片%d从%c搬到%c
    ",n,x,z);
            Hanoi(n-1,y,x,z);
        }
    }
    
    int main()
    {
        int n = 4;
        char x = 'x',y = 'y',z = 'z';
        Hanoi(4,x,y,z);
        return 0;
    }

    似乎有点看不懂。。。。那运行一下

    将盘片1从x搬到y  // 1

    将盘片2从x搬到z

    将盘片1从y搬到z

    将盘片3从x搬到y

    将盘片1从z搬到x

    将盘片2从z搬到y

    将盘片1从x搬到y  // 1

    将盘片4从x搬到z

    将盘片1从y搬到z  // 2

    将盘片2从y搬到x

    将盘片1从z搬到x  // 2

    将盘片3从y搬到z

    将盘片1从x搬到y  // 3

    将盘片2从x搬到z

    将盘片1从y搬到z

    额。。。。还是不会


    1.1将上面 n-1 个盘移动到 y 上;  (包含一号所有内容)

    1.2将 n 号盘移动到 z 上;     (红色四号盘到z)

    1.3将上面 n-1 个盘再移动到 z 盘上;


    2.1将上面 n-2 个盘移动到y上;   (包含二号所有内容)

    2.2将 n-1 号盘移动到 z 上;    (红色三号盘到z)

    2.3将上面 n-2 个盘再移动到 z 盘上;


    ............

    以此类推即可。

    那么每个 x.3 的内容包含的应该是什么呢? x.3 包含的实际上就是自他以下全部的步骤,而这些所有的步骤有都可一看做是 5 号盘移动到 z 之后的后续步骤,就这样构成了递归。

    当然这只是为了分析一下这个 Hanoi 递归程序所思考的内容,我根据递归程序分析过程和根据问题分析递归是完全不同的方案,切不可混为一谈。

    分析递归程序也应当尽可能的去寻找相似的函数,去分析其结构。


    时间复杂度分析:

    T(n) = O(1)        n = 1;

    T(n) = 2T(n-1) + 1   n > 1;

    可以求出来  T(n) = O(2^n)  ;

    2020-09-08

  • 相关阅读:
    C#——面向对象,常用类
    C#——基础
    C#——winform
    Oracle——PL/SQL,存储过程/函数,java连接Oracle操作存储过程/函数,触发器
    Oracle——数据处理(增删改查),创建表与管理表,视图,索引,同义词
    Oracle——集合运算
    PoisonTap
    在Ubuntu上安装LAMP(Apache、Mysql、Php)
    "Unable to locate package lrzsz"的解决办法
    OtterCTF
  • 原文地址:https://www.cnblogs.com/2015-16/p/13635229.html
Copyright © 2011-2022 走看看