| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3717 人关注过本帖
标题:递归思路总是搞不明白,就比如汉诺塔。
只看楼主 加入收藏
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
结帖率:81.82%
收藏
已结贴  问题点数:15 回复次数:9 
递归思路总是搞不明白,就比如汉诺塔。
1.为什么汉诺塔能用函数递归调用解决(或者说怎样判断一个问题它是否能用递归思想,千万别跟我说阶乘的例子那个我知道)?
2.汉诺塔的自身调用结束条件是什么?
代码如下,请帮忙分析一下上面的问题。(码盲表示压力太大学递归,求指导鼓励...)
程序代码:
#include<stdio.h>
void move(int n,int x,int y,int z)
{
    if(n==1)
        printf("%c----->%c   ",x,z);
    else
    {
    move(n-1, x, z, y);
    printf("%c----->%c   ",x,z);
    move(n-1,y,x,z);
    }
}
void main()
{
    int h;
    printf("please input a number:\n");
    scanf("%d",&h);
    printf("the step to moving %2d diskes:\n",h);
    move(h,'a','b','c');
}

搜索更多相关主题的帖子: 大学 
2016-07-11 16:38
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
为什么这么浏览了不回答。。。在线等,搞不清粗很难受的
2016-07-11 16:41
vvvcuu
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:353
专家分:1253
注 册:2014-4-22
收藏
得分:5 
可能是大都心里明白,却不知道该怎么用语言表达吧。

汉诺塔的例子就是一个if语句啊。 每次调用move()函数的时候都对n判断一次, 如果是1就printf了, 否则继续调用move()函数, 也就是自身调用自身.

C语言要求使用前先定义, 但结构体和递归这两个概念是例外的, 允许未定义即可使用.

代码测试环境:  WinXP+C-Free5.0.
2016-07-11 17:48
平常心q
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:120
专家分:550
注 册:2016-3-31
收藏
得分:5 
一般需要递归解决的问题有两个特点:
    存在限制条件,当符合这个条件时递归便不再继续;
    每次递归调用之后越来越接近这个限制条件。

如果你仔细观察递归函数,你会发现递归调用是函数所执行的最后一项任务。这个函数是尾部递归(tail recursion)的一个例子。

汉诺塔的自身调用结束条件是 n==1 时,  否则继续调用move()函数, 也就是自身调用自身

2016-07-11 19:48
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
回复 3楼 vvvcuu
能就这个汉诺塔的例子详细解释一下吗?n==1时把x上的最后一个盘子移到了z上(执行printf)?下面一句move(n-1,y,x,z)的结束条件又是什么?难道是把y上的n-1个盘全移到z上就结束?总感觉这个汉诺塔的递归思路有点抽象,和其他的问题不一样。能多讲一点关于汉诺塔的递归过程和条件吗,能分步讲解就更好了!谢谢!!!
2016-07-12 09:12
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
回复 4楼 平常心q
能就这个汉诺塔的例子详细解释一下吗?n==1时把x上的最后一个盘子移到了z上(执行printf)?下面一句move(n-1,y,x,z)的结束条件又是什么?难道是把y上的n-1个盘全移到z上就结束?总感觉这个汉诺塔的递归思路有点抽象,和其他的问题不一样。能多讲一点关于汉诺塔的递归过程和条件吗,能分步讲解就更好了!谢谢!!!
2016-07-12 09:12
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
有人吗???看会冒个泡也行嘛
2016-07-12 09:43
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
现在都没几个人学c了?问个问题都没几个人看的
2016-07-12 11:11
U201010009
Rank: 3Rank: 3
等 级:论坛游侠
威 望:6
帖 子:73
专家分:178
注 册:2013-2-25
收藏
得分:5 
1.汉诺塔的解决方法是有重复相同操作的规律的,所以可以用递归调用(执行有限次重复的操作,递归里要写结束递归的条件)
2.代码中汉诺塔的递归结束条件就是传入的n=1的时候, 就是move(n, a, b, c)中会调用2次move()(n!=1时候),然后这调用的2次move()里又会判断是否调用2次move(),最后都在n==1的时候结束当前move()。
这段代码要看懂首先楼主要懂汉诺塔的规律了,不是一两句可以说清楚的;最简单的方法就是你设置n=3的时候看看结果,然后调试跟踪代码,手画一下调用流程,你就会清楚的。
2016-07-13 12:23
悬崖之树
Rank: 2
等 级:论坛游民
威 望:1
帖 子:36
专家分:23
注 册:2013-5-1
收藏
得分:0 
经过一个下午的研究,发现汉诺塔的递归不是普通的递归,它的移动盘子的顺序不是保存在函数体中,而是保存在函数的参数中,这可以从老师分析算法的时候看出来。如 move(n,a,b,c),就表示把a通过b移动到c上。整个程序在递归时,形成了一颗二叉树,每个节点保存了移动的信息,当然顺序是反的。当递归在回退时,相当于遍历了二叉树,并且通过print函数输出了保存在每个move函数副本申明里的移动信息。这样就把问题解决了。
2017-05-21 21:56
快速回复:递归思路总是搞不明白,就比如汉诺塔。
数据加载中...
 
   



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

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