先上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