汉诺塔(递归)
来源:互联网 发布:剑灵龙女完美身材数据 编辑:程序博客网 时间:2024/06/03 19:02
阅读递归函数最容易的方法不是纠缠于它的执行过程,而是相信递归函数会顺利完成它的任务。如果你的每个步骤正确无误,你的限制条件设置正确,并且每次调用之后更接近限制条件,递归函数总是能够正确地完成任务。——《C和指针》
一、游戏规则
有三个塔,第一个塔上放了若干个盘子。要将这若干个盘子借助第二个塔移动到第三个塔上面。规则只有一个,大盘子必须在小盘子上面。
二、伪算法
定义一个函数,接收4个参数,分别是:盘子的个数、起始柱子、辅助柱子、目标柱子。
函数原型
void hanoi(int n, int src, int temp, int dst);
我们的hanoi
函数将一件事分解成三件小事,而这三件小事本质上和它本身做的工作是一样的。将 n 个盘子移动到另一根柱子,和将 n-1 个盘子移动到另一根柱子,没有任何区别。当n=1时,可以直接移动。
伪算法
如果只有一个盘子 直接移动到目标柱子否则 将 n-1 个盘子移动到辅助柱子 将最后一个盘子移动到目标柱子 将 n-1 个盘子从辅助柱子移动到目标柱子
没了,就这么简单。根本不需要管 n-1 个盘子是怎么移动的,也不需要担心大盘子会跑到小盘子上面,递归函数帮我们做好了一切。
三、代码实现
#include <stdio.h>// 第一个参数是盘子数、第二个参数是起始柱子、然后是辅助柱子、最后一个是目标柱子void hanoi(int n, int src, int temp, int dst);int main() { // 借助第二根柱子,将3个盘子从第一根柱子移动到第三根柱子 hanoi(3, 1, 2, 3); return 0;}void hanoi(int n, int src, int temp, int dst) { if (n == 1) { printf("%d -> %d\n", src, dst); } else { // 请仔细观察参数的顺序 hanoi(n - 1, src, dst, temp); hanoi(1, src, temp, dst); hanoi(n - 1, temp, src, dst); }}
四、总结
递归的两个要素:一个是必须要有出口;另一个就是通过调用自己来简化问题,使每次递归后都更接近出口。
不要尝试跟踪递归的每一步,这样只会让问题变得复杂。
阅读全文
0 0
- -汉诺塔-递归算法(JS递归函数)
- -汉诺塔-递归算法(JS递归函数)
- 汉诺塔(递归算法)
- 汉诺塔(递归实现)
- 汉诺塔(递归)
- 汉诺塔(递归法)
- 汉诺塔(典型递归)
- 汉诺塔(递归)
- 【Openjudge】汉诺塔(递归)
- 汉诺塔(递归运算)
- 递归调用(汉诺塔)
- 汉诺塔问题(递归)
- 汉诺塔问题(递归)
- 汉诺塔算法(递归)
- 汉诺塔(递归)
- 汉诺塔问题(递归)
- 汉诺塔游戏(递归)
- 汉诺塔(递归调用)
- 1.初识JavaScript
- C++复习(2):类的一系列操作.友元
- 习题6(6.10)
- PIL opencv 学习网站记录
- Java线程synchronized、Lock
- 汉诺塔(递归)
- uva 10082 WERTYU(错位键)
- android studio的项目添加gson依赖库 搜索显示nothing to show
- JS的Cookie操作方法
- 简述Vin码识别/车架号识别技术
- windows事件跨session访问
- 统计文件每个字母出现次数
- ACdream 1082
- 通过UWP Bridge和Visual Studio将桌面应用转为UWP应用