先上Hanoi的递归代码:

#include <iostream>

using namespace std;

void Hanoi(int n,char x,char y,char z) {
    if(n == 1)
        printf("将盘片%d从%c搬到%c\n",n,x,z);
    else {
        Hanoi(n-1,x,z,y);
        printf("将盘片%d从%c搬到%c\n",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

 

posted on 2020-09-08 21:14  夜_归_人  阅读(246)  评论(0编辑  收藏  举报