| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1982 人关注过本帖
标题:关于汉诺塔的问题,知道怎么移动盘子,却没明白计算机如何执行代码的
只看楼主 加入收藏
autumnyellow
Rank: 2
等 级:论坛游民
帖 子:72
专家分:75
注 册:2015-4-14
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
关于汉诺塔的问题,知道怎么移动盘子,却没明白计算机如何执行代码的
谁能解释一下汉诺塔C语言递归代码是怎么执行的
2013-09-15 | 分享
#include<stdio.h>
#include<stdlib.h>
int main()
{
int hanoi(int n,char one,char two,char three);
int m;
printf("input the number of diskes:");
scanf("%d",&m);
printf("The step to moving %d disk:\n",m);
hanoi(m,'A','B','C');
system("pause");
}
int hanoi(int n,char one,char two,char three)
{
int move(char x,char y);
if(n==1)
move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
int move(char x,char y)
{
printf("%c-->%c\n",x,y);
}
***********************************************************
这段代码没有看懂int hanoi(int n,char one,char two,char three)
{
int move(char x,char y);
if(n==1)
move(one,three);
else
{
hanoi(n-1,one,three,two);//one借助two移到three   
move(one,three);
hanoi(n-1,two,one,three);
}
}他是怎么执行的,网上查了几天了都是说的搬运的过程却没有人说明计算机执行代码的过程
搜索更多相关主题的帖子: include 计算机 system moving number 
2015-07-16 16:08
hjx1120
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:李掌柜
等 级:贵宾
威 望:41
帖 子:1314
专家分:6927
注 册:2008-1-3
收藏
得分:0 

用断点,观察代码的变化
2015-07-16 16:25
autumnyellow
Rank: 2
等 级:论坛游民
帖 子:72
专家分:75
注 册:2015-4-14
收藏
得分:0 
什么是断点??
2015-07-16 17:42
erty1001
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:331
专家分:1433
注 册:2014-8-31
收藏
得分:10 
简单说说:
   这个汉诺塔是一个复杂的编程问题,你不必观察每一步它去实现什么
   重点是理解计算机 的循环思想,这里应该是自身迭代 或者自我调用
   涉及到这种算法往往会压入大量的堆栈 看断点不可能实现
   
 
2015-07-16 22:10
erty1001
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:331
专家分:1433
注 册:2014-8-31
收藏
得分:10 
我可以简单的给你说一个类似的例子:
  平面上有很多网格,我们假设是100*100  
  网格内部可以是白色或者黑色 只有这两种情况
  现在要求 给定任意个点的坐标 计算出所有和这个点“相通”的黑点的数量
  “相通”指的是 如果两个格子上下或者左右相连就是相通。
  有种算法是大概这样实现的,最基础的算法是:
  标记当前点为 《起点》
   《《算法开始》》
 在一个给定点上 标记当前点为《查找过》  计量数+1
  依次求改点上 下 左 右 四个方向上的点(不越界的情况下)
 看谁是黑色的,不是就跳过,看下一个 是黑色的话,看看是不是标记过
   1如果是标记过 放弃 下一个方向
   2如果没有标记过
               (1)  然后保存当前的点坐标,和刚刚查找过的方向,压入到堆栈,把刚刚找到的这个黑点、
                      当成新的起始点 从    《《算法开始》》再 算起
  3如果这一圈搜索完毕,如果这个点不是起始点 那么把上一个堆栈的内容拿出来 继续下一个方向
 4 如果这一圈搜索完毕 如果这点事起始点 那么好了算法结束

   
2015-07-16 22:23
autumnyellow
Rank: 2
等 级:论坛游民
帖 子:72
专家分:75
注 册:2015-4-14
收藏
得分:0 
回复 5楼 erty1001
你是在回复这个问题吗?大哥!!
2015-07-16 22:52
Cor
Rank: 2
来 自:江苏南通
等 级:论坛游民
帖 子:17
专家分:59
注 册:2014-1-23
收藏
得分:0 
程序是用的递归算法:只有1个盘子时直接移动;假设现有A,B,C三个柱子,n个盘子放在A上,把上面n-1个先移到B上,最后一个移到C上,然后再把B上n-1个移到C上,就实现从A->C的移动.
会移动1个盘子,就会移动2个,就会3个,...,就会n个(n是自然数).
就和计算Fibonacci数列一样,想求第n个数,先求第n-1个和n-2个数,...,直到要求第2个和第1个数.于是第3个数求出来了,于是第4个数,...,于是第n个数.与此类似.

[ 本帖最后由 Cor 于 2015-7-17 23:42 编辑 ]

均衡
2015-07-17 23:23
快速回复:关于汉诺塔的问题,知道怎么移动盘子,却没明白计算机如何执行代码的
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022059 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved