| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2288 人关注过本帖
标题:河内之塔
只看楼主 加入收藏
nhy2014
Rank: 2
等 级:论坛游民
帖 子:18
专家分:21
注 册:2013-5-4
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
河内之塔
#include <stdio.h>

void hanoi(int n, char a, char b, char c)
{
    if(n==1)
    {
        printf("move sheet %d from %c to %c\n", n, a, c);
    }
    else
    {
        hanoi(n-1, a, c, b);
        printf("move sheet %d from %c to %c\n", n, a, c);
        hanoi(n-1, b, a, c);
    }
}

int main(void)
{
    int n;
    printf("请输入盘数:");
    scanf("%d", &n);
    hanoi(n, 'a', 'b', 'c');

    return 0;
}
求高手解释函数void hanoi中的具体意思 谢谢了
搜索更多相关主题的帖子: void 河内 include return 
2013-05-17 02:47
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:4 
这是经典的递归算法,你可以百度一下,首先用小的数字实现,看看具体怎么操作,然后再理解一般的n
另外,请搜索:汉诺塔

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2013-05-17 07:16
我叫沃恩
Rank: 12Rank: 12Rank: 12
来 自:Asia
等 级:贵宾
威 望:10
帖 子:1234
专家分:3865
注 册:2013-3-29
收藏
得分:4 
百度吧!

因为我是菜鸟,所以应该被骂! 细节+坚持=成功!
2013-05-17 08:04
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2392
专家分:13384
注 册:2013-3-3
收藏
得分:4 
这个可是经典的递归调用的例子,汉诺塔的思路,就是利用C将A中的盘子移动到B,这是第一步,第二步,借助A将B上的盘子移动到C,成功,你对照看

Maybe
2013-05-17 09:43
whukeming
Rank: 2
等 级:论坛游民
帖 子:76
专家分:51
注 册:2008-8-24
收藏
得分:4 
我比较仔细的研究过,看我这个

程序代码:
# include "stdio.h"
void move(char x, char y) //自定义move函数,用来将块从起始柱子x移动到目标柱子y,这里的x,y为形参,不代表具体哪根柱子

{
    printf("\t%c-->%c\n",x,y);
}
void hannuota(int n, char a, char b, char c) //自定义hannuota函数,这里的a,b,c为形参,不代表具体哪根柱子

{
    if (n == 1)
        move(a, c); //调用自定义函数move
                                                                       
    else                                                               
                                                                       
    {        
        hannuota(n-1, a, c, b);  //第一行递归
        
        move(a, c);  //调用自定义函数move
        
        hannuota(n-1, b, a, c);  //第二行递归
        
    }
}


int main(void)

{
    int n;
    
    printf("请输入要移动的块数:\n");
    scanf("%d", &n);
  
    hannuota(n, 'a', 'b', 'c');
    
    return 0;
}
/*执行详细步骤:当n = 3 时
                 n = 3           n = 2          n = 1
                
                |               |h(1, a, b, c)=>move(a, c)=> a->c      //1
                |h(2, a, c, b)    |move(a, b)                  a->b      //2
                |               |h(1, c, a, b)=>move(c, b)=> c->b      //3
                |

 h(3, a, b, c)    |move(a, c)                                  a->c      //4
                |
                |               |h(1, b, c, a)=>move(b, a)=> b->a      //5                      
                |h(2, b, a, c)    |move(b, c)                  b->c      //6
                |               |h(1, a, b, c)=>move(a, c)=> a->c      //7
                |


 执行结果:

 请输入要移动的块数:

 3

 a-->c

 a-->b

 c-->b

 a-->c

 b-->a

 b-->c

 a-->c

 */


[ 本帖最后由 whukeming 于 2013-5-17 14:39 编辑 ]
2013-05-17 14:37
nhy2014
Rank: 2
等 级:论坛游民
帖 子:18
专家分:21
注 册:2013-5-4
收藏
得分:0 
回复 5楼 whukeming
很详细 谢谢哈
2013-05-17 15:04
nhy2014
Rank: 2
等 级:论坛游民
帖 子:18
专家分:21
注 册:2013-5-4
收藏
得分:0 
回复 4楼 邓士林
嗯 貌似理解了  谢谢
2013-05-17 15:05
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:4 
画出地柜调用树你就明白了很多递归问题

                                         
===========深入<----------------->浅出============
2013-05-17 18:08
快速回复:河内之塔
数据加载中...
 
   



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

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