汉诺塔递归及非递归解法
来源:互联网 发布:java面试集合面试题 编辑:程序博客网 时间:2024/05/16 06:24
1. 经典递归解法
#include <iostream>void mov(char a, char b){std::cout << a << " -> " << b << std::endl;}void recursive_hanoi(int n, char a, char b, char c){if (n == 0) return;recursive_hanoi(n - 1, a, c, b);mov(a, c);recursive_hanoi(n - 1, b, a, c);}int main() {recursive_hanoi(3, '1', '2', '3');return 0;}
2. 非递归解法
从汉诺塔的递归解法可以看出,它跟二叉树中序遍历递归解法是一个道理。既然二叉树非递归解法能写出来,那么汉诺塔非递归解法也不难写出来。
#include <iostream>#include <stack>struct HanoiNode{private:int num = 0;char a, b, c;public:HanoiNode() = default;HanoiNode(int n_, char a_, char b_, char c_): num(n_), a(a_), b(b_), c(c_) {}bool is_null(){return num == 0;}HanoiNode left(){if (is_null()) return *this;return HanoiNode(num - 1, a, c, b);}HanoiNode right(){if (is_null()) return *this;return HanoiNode(num - 1, b, a, c);}void mov() const { std::cout << a << " -> " << c << std::endl; }};void nonrecursive_hanoi(int n, char a, char b, char c){if (n < 0) return;std::stack<HanoiNode> hn;HanoiNode hnd(n, a, b, c);while (!hnd.is_null() || !hn.empty()){if (!hnd.is_null()){hn.push(hnd);hnd = hnd.left();}else{hnd = hn.top();hn.pop();hnd.mov();hnd = hnd.right();}}}int main() {nonrecursive_hanoi(3, '1', '2', '3');return 0;}
0 0
- 汉诺塔递归及非递归解法
- 二叉树遍历--递归及非递归解法
- 背包非递归解法
- Fibonacci非递归解法
- 【(伪)递归】HDU1997 - 汉诺塔VII(非递归解法)
- 汉诺塔问题的递归解法与非递归解法(堆栈解法)
- 汉诺塔,递归&非递归
- 二叉树先序遍历中序遍历递归及非递归解法
- 汉诺塔的递归解法
- 汉诺塔递归解法
- 汉诺塔问题递归解法
- 递归思想-汉诺塔解法
- 汉诺塔问题递归解法
- 汉诺塔的递归解法
- 汉若塔游戏非递归解法(c#)
- 迷宫的另一种解法[非递归]
- 数据结构 迷宫 C++源代码 非递归解法
- 背包问题的非递归解法
- Eclipse 快捷键
- 03-树1 树的同构
- 人生的职业规划
- 关于各种Activity的用途
- 安装pip
- 汉诺塔递归及非递归解法
- noip2014 螺旋矩阵 (模拟)
- 数据结构实践——建立顺序栈算法库
- 关于json格式转换为.xls .mdb的终极解决方案
- HTTP Status 500 - The Struts dispatcher cannot be found. This is usually caused by using Struts tags
- C语言中volatile关键字的作用
- codeblock快捷键说明
- 组合逻辑电路
- 例题5.21 邦德 UVa11354