汉诺塔(Hanoi)问题递归&非递归的C++实现及总结
来源:互联网 发布:ubuntu修改hosts翻墙 编辑:程序博客网 时间:2024/06/04 20:05
汉诺塔(Hanoi)问题递归&非递归的C++实现及总结
由于刚入门不算很久,所以就那汉诺塔这种简单问题来练下手啦~~
【汉诺塔问题内容】(虽然路人皆知但还是写一下好了。。。)
相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
详细的背景可以去百度百科自己看~~
【递归实现】
//汉诺塔问题最简单最经典的解决方法当然是递归解决啦~~
#include <iostream>using namespace std;void hanoi(int n, int a, int b, int c){ if(n > 0) { hanoi(n-1, a, c, b); cout << "move " << a << " to " << b << endl; hanoi(n-1, c, b, a); }} int main(){ int n; cin >> n; hanoi(n, 1, 2, 3); return 0;}
//非常简单就搞定了
【非递归实现】
//当然汉诺塔问题也可以非递归实现,就是写起来稍微麻烦一点点,主要依赖于栈的数据结构。
#include <iostream> #include <stack> using namespace std; struct hanoiunrec //结构体,表示汉诺塔的信息 { hanoiunrec(); hanoiunrec(int n, char a, char b, char c):_n(n), _x(a), _y(b), _z(c){} //构造函数 int _n; char _x, _y, _z; }; void hanoi(int n, char x, char y, char z) { stack<hanoiunrec> s; //声明一个汉诺塔类型的栈,即其元素都具有汉诺塔结构体信息 s.push(hanoiunrec(n, x, y, z)); //将一个汉诺塔入栈 while (!s.empty()) //栈不空则执行 { hanoiunrec q = s.top(); //取栈顶元素为q s.pop(); //把栈顶弹出 n = q._n; //分别将当前处理汉诺塔信息赋给函数参数 x = q._x; y = q._y; z = q._z; if (n == 1) //如果只剩一个盘了,则移动并输出操作 { cout << "Move " << q._x << " to " << q._z << endl; } else //还剩多个盘,则将新的汉诺塔元素入栈,返回while循环开始操作 { s.push(hanoiunrec(n - 1, y, x, z)); s.push(hanoiunrec(1, x, y, z)); s.push(hanoiunrec(n - 1, x, z, y)); } } }int main() { hanoi(10, 'A', 'B', 'C'); //以10个盘举个例子 return 0; }
【递归与非递归方法的异同】
其实咧,,汉诺塔问题递归与非递归实现对于计算机而言原理是相同的。首先,在时间复杂度方面,两种方法相同,均为O(2n);对于实现结果,两种方法产生的序列也是相同的,证明可参考《算法设计与分析习题解答(第3版)》,王晓东编著;在空间复杂度方面,递归实现每一次调用递归函数,计算机将为其分配新的内存,其占用空间大于非递归实现所利用的栈结构。
阅读全文
0 0
- 汉诺塔(Hanoi)问题递归&非递归的C++实现及总结
- 《程序员的数学》:汉诺塔问题(Hanoi问题)的递归算法与非递归算法总结
- hanoi汉诺塔问题的递归实现
- 汉诺塔问题(Hanoi问题)的递归算法与非递归算法详解
- 汉诺塔(Hanoi)问题递归算法实现
- 实现汉诺塔(Hanoi)问题(堆栈、递归)
- Hanoi(汉诺)问题的非递归解法
- 汉诺塔问题 hanoi(递归)
- (原创)Hanoi塔问题的递归方法与非递归方法(java实现)
- 汉诺塔 Hanoi 递归实现
- JavaShowAlgorithm-hanoi的递归和非递归
- 汉诺塔Hanoi 递归 & 非递归 & 4柱汉诺塔
- hanoi(汉诺)塔问题C++的递归实现
- Mergersort的递归及非递归实现
- Fibonacci的递归及非递归实现
- 简单递归—Hanoi(汉诺塔问题)
- 汉诺塔问题 hanoi tower (递归)。
- 用C语言解决(hanoi)汉诺塔问题——函数的递归调用
- <C++ Primer_5th>习题_3.17
- java序列化与反序列化(2)------jdk原生序列化机制Serializable
- 事务详解
- <C++ Primer_5th>习题_3.20
- matlab基础(2)
- 汉诺塔(Hanoi)问题递归&非递归的C++实现及总结
- 十进制转十六进制的C实现
- 【HDU 1003】 Max Sum
- <C++ Primer_5th>习题_3.22
- 167. Two Sum II
- <C++ Primer_5th>习题_3.23
- Spring框架-第一弹
- ios-frame和bounds
- LinkList_Stack(链式栈)