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

  • 相关阅读:
    let 及const
    ES6与ES2015、ES2016以及ECMAScript的区别
    AMD CMD commonJS es6
    千里之行,始于足下
    学习随笔 pyspark JDBC 操作oracle数据库
    学习随笔--pyspark RDD常用操作
    学习随笔--Spark java开发入门
    学习随笔--flask框架基本搭建
    学习随笔--scrapy爬虫简单实例
    学习随笔-python动态爬取空气质量网数据的实现
  • 原文地址:https://www.cnblogs.com/2015-16/p/13635229.html
Copyright © 2011-2022 走看看