鱼C论坛

 找回密码
 立即注册
查看: 4594|回复: 11

汉诺塔问题完全没有头绪。。。

[复制链接]
发表于 2013-6-15 10:03:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
今天看了甲鱼老师的汉诺塔视频,完全没有头绪,而且怎么想也想不通汉诺塔跟递归有啥子的关系。。。能不能详细的给我讲讲,,
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-15 15:04:44 | 显示全部楼层
用递归可以很轻松地解决汉诺塔问题而已,有时间我给你个程序,你看下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-15 15:18:43 | 显示全部楼层
好比A,B,C。把A上的东西移动到C上,首先借助C把A上的东西-1移动到B上,再借助A把B上的所有移动到C上,里面就牵扯到了递归,我感觉关键就是理解好那借助的问题,语言组织的可能不是很好,希望对你有帮助{:1_1:}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-16 08:55:22 | 显示全部楼层

还是不懂额。。。唉
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-16 11:42:42 | 显示全部楼层
多看看,多想想吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-16 12:39:41 | 显示全部楼层
你先试着有三个碟,先理解,然后再增加1个,以此类推,你会懂的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-16 14:04:11 | 显示全部楼层
:D看看!!!!!!!!!!!!!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-16 15:23:16 | 显示全部楼层
Kevn 发表于 2013-6-16 12:39
你先试着有三个碟,先理解,然后再增加1个,以此类推,你会懂的

好吧。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-11 09:50:09 | 显示全部楼层
http://zhidao.baidu.com/question/394860461.html?fr=ala&device=mobile&ssid=0&from=2001a&uid=219EDB9A88792B8C77FD6159895D0ACB&pu=usm%401%2Csz%401320_2003%2Cta%40iphone_1_5.1_1_&bd_page_type=1&tj=zhidao_2_0_10_title          看看这个。看完了    就应该能大慨理解怎么回事了.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-16 18:51:40 | 显示全部楼层
可以画图啊,小甲鱼老师不是说了吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-16 19:33:34 | 显示全部楼层
看看我写的吧,
思路就是把所有盘子从A移到B,
假设有n个盘子,则先把n-1个盘子从A移到C,再把一个盘子从A移到B,再把n-1个盘子从C移到B,
至于n-1个盘子怎么移?
就用递归函数,相当于第一次的n,
具体看看代码吧,应该能懂
#include<iostream>
using namespace std;

void move(char a,char b)
{
        cout<<a<<"->"<<b<<endl;
}
void hanoi(int j,char a,char b)  //把j个盘子从a移到b
{
        if(j==1)
                move(a,b);
        else
        {
                char c;
                if(a=='A'&&b=='B')
                        c='C';
                else if(a=='A'&&b=='C')
                        c='B';
                else if(a=='B'&&b=='C')
                        c='A';
                else if(a=='B'&&b=='A')
                        c='C';
                else if(a=='C'&&b=='A')
                        c='B';
                else if(a=='C'&&b=='B')
                        c='A';
                hanoi(j-1,a,c);
                move(a,b);
                hanoi(j-1,c,b);
        }
}
int main()
{
        int n;
        while(1)
        {
                cout<<"请输入盘子的个数:"<<endl;
                cin>>n;
                if(n==0)
                        break;
                cout<<"移动的方法为:"<<endl;
                hanoi(n,'A','B');
        }
        return 0;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-16 22:06:10 | 显示全部楼层
想不通的话,用笨一点的办法 拿3个积木 标明 ABC 然后自己尝试摆摆
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-23 11:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表