深刻的理解递归汉诺塔(Hanoi)
来源:互联网 发布:windows 平板 编辑:程序博客网 时间:2024/06/06 08:30
算法:
1, 从目标出发,我们将n个盘子从A移动到B通过C,假如我们这样写
hanoi(n, a, b, c);
2, 同理,我们也就可以知道,将n-1个盘子从A移动到B通过C,即就是:
hanoi(n-1, a, b, c);
3, 但是我们知道我们一次只能移动一个盘子,所以,如果我们要将n个盘子从A移动到B通过C,我们可以将其分解为三步(对其进行递归,从难到易,知道移动完最后一个然后退出程序):
1,我们先将n-1个盘子从A移动到C通过B: hanoi(n-1, a, c, b);
2,然后我们就可以先将第n个盘子从A移动到B: move(n, a, b);
3,最后我们再将n-1个盘子从C移动到B通过A: hanoi(n-1, c, b, a);
程序:
#include <stdio.h> void move(int n , char a, char b){ printf("第%d个盘子:从%c ---> %c\n",n, a, b);}void hanoi(int n, char a, char b , char c){ //将n个盘子从a移动到b经过c if(n == 0) return ; hanoi(n-1, a , c , b); //将n-1个盘子从a移动到c经过b move(n, a, b); //将第n个盘子从a移动到b; getchar(); hanoi(n-1, c, b, a); //将n-1个盘子从c移动到b经过a }int main(){ int n; printf("plz input 盘子数n:"); scanf("%d", &n); while(n<=0){ printf("抱歉,你输入的不合格!!!,请重新输入:\n"); scanf("%d", &n); } hanoi(n, 'A', 'B', 'C'); return 0;}
运行结果:
值得注意的是:
我们写的程序应该能经得起一般的验证,
当直接写这个函数:
hanoi(3, 'A', 'B', 'C');用户只能看到移动3个盘子的情况,不能验证其他情况,这样真的好吗??
当n是由用户自己输入的情况下,那么可能会出现一些非法的情况,如n的输入值为负或者0的情况呢??
所以,我们应该让我们的程序鲁棒行强一点,让我们一起养成好习惯吧!!!
1 0
- 深刻的理解递归汉诺塔(Hanoi)
- 汉诺塔问题 hanoi(递归)
- hanoi汉诺塔问题的递归实现
- 简单递归—Hanoi(汉诺塔问题)
- 汉诺塔(Hanoi)问题递归算法实现
- 汉诺塔问题 hanoi tower (递归)。
- C++ 数据结构 hanoi 汉诺塔(递归 栈)
- 实现汉诺塔(Hanoi)问题(堆栈、递归)
- TOJ4132 Hanoi tower 汉诺塔(递归入门)
- 汉诺塔 Hanoi 递归实现
- 汉诺塔 hanoi 递归
- 递归之汉诺塔(Hanoi)
- 递归算法-->汉诺塔hanoi
- 《程序员的数学》:汉诺塔问题(Hanoi问题)的递归算法与非递归算法总结
- 汉诺塔问题(Hanoi问题)的递归算法与非递归算法详解
- 汉诺塔(Hanoi)问题递归&非递归的C++实现及总结
- 递归栈(hanoi问题)
- 汉诺塔问题深刻而简单的理解
- 任务、进程和线程
- Android高效加载大图、多图解决方案,有效避免程序OOM
- 【求助】js到处Excel window.btoa IE 下没有定义
- C/C++ 文件路径解析
- jsp导入的包,包里明明有方法,但总是报方法没有定义的错
- 深刻的理解递归汉诺塔(Hanoi)
- Java学习整理系列之ThreadLocal的理解
- codeforces632E. Thief in a Shop (dp)
- Spring Cache
- 关于C++内存中字节对齐问题的详细介绍
- php include文件的编码影响ajax接收
- B. Far Relative’s Problem
- Arduino通信协议设计
- 屏幕适配之-Autoresizing