当前位置:编程学习 > C/C++ >>

谁给提供汉诺塔的C语言递归解法详细说明啊?

我要详细点的步骤最好有示意图的,我太笨了看了好多遍都没看懂!哪位好心人给帮个忙!先谢谢啦!
追问:程序执行到:PlayHanio(dishNum-1, source, helpMedia, destination); 

printf("Move %c to %c\n", source, destination);

PlayHanio(dishNum-1, helpMedia, destination, source);

这里怎么循环的?麻烦你给我讲讲这个执行顺序,还有一直到N=1时,再怎么回来?谢谢!

答案:#include <stdio.h>

/* 参数分别是盘子个数,盘子原来所在的柱,要到的目的柱,和要借助的媒介柱*/

void PlayHanio(int dishNum, char source, char destination, char helpMedia)
{
if (dishNum == 1) <-------当盘子只有一个时,那就易了
{ printf("Move %c to %c\n",source, destination); } <-------从原柱移向目的柱

else <--------如果不是一个盘了,而最后一个盘是最大的,应先到目的柱上
{

/* 将最大盘上面的所有盘子递归移向helpMedia, 过程是借助destination,完成后就剩下最大和空的dst柱
PlayHanio(dishNum-1, source, helpMedia, destination);

printf("Move %c to %c\n", source, destination); <---经过上面最大盘就能移向空的destination
/* 最后,把上面移在helpMedia的盘子按该方法都移向destination,注意最大盘子和盘子个数现在变了哦*/

PlayHanio(dishNum-1, helpMedia, destination, source);
}
}
int main(void)
{
char first='A', second='B', third='C'; <---------三条柱A,B,C
int dishNum = 3; <-------盘子个数假设三个

PlayHanio(dishNum, first, second, third);

return 0;
}

上面是汉诺塔的原理,如果你记住了这,编出该程序很容易

建议试从3,4个盘子去进行程序分析,因为原理是一样,只是那些柱在递归时是不断变化的,这要注意!!

但是多个就不太现实了,假设有N个盘子,那你就移动2^n-1次哦

学递归建议开始记住它的原理,能编出程序就可以,不要老是想追根究底,这样你总是连程序都不会编

如快速排序,二叉树……

当然上述对我是可以的,对你我就不清楚了,自己去尝出一条路吧

还有就是递归的原理其实是涉及到堆栈的压栈和出栈的,也不难啦,它不能提高速度,

相反,每递归一次,它就得把上一个函数的地址压栈,这样递归次数多时内存就大啊

但是,但的一大作用就是让程序清晰明了!上面的程序你如果用条件语句编写,盘少可以,多就乱了~~

`
这是我回答过的,它当时看得懂了哦!

相信你也行!

//*********************************************************
//比书上更好理解的汉诺塔递归算法
//*********************************************************
#include <stdio.h>
#include <stdlib.h>
long step=1;//步数计数
///////////////////////////////////////////////
void HanNuo(long n,//要移动的盘子个数
char f,//被移动盘子起始柱子
char m,//移动时被利用的柱子
char t)//移动到的目标柱子
{
if(n==1)//只有一个盘子,直接移动并打印,递归结束
{
printf("第%d步:%c->%c\n",step,f,t);
step++;
}
else
{
HanNuo(n-1,f,t,m);//利用最后一个柱子将正数n-1个盘子移动到中间柱子
printf("第%d步:%c->%c\n",step,f,t);//移动最下面得盘子从第一个柱子到最后一个柱子,并完成输出
step++;
HanNuo(n-1,m,f,t);//利用第一个柱子将正数n-1个盘子移动到最后一个柱子
}
return;
}
///////////////////////////////////////
int main()
{
long s;
printf("输入盘子个数:\n");
scanf("%d",&s);
HanNuo(s,'A','B','C');
system("pause");
return 0;
}

汉诺塔(又称河内塔)问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒A、B和C,A上面套着n个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从A棒搬到C棒上,规定可利用中间的一根B棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。僧侣们搬得汗流满面,可惜当n很大时这辈子恐怕就很搬了 聪明的你还有计算机帮你完成,你能写一个程序帮助僧侣们完成这辈子的夙愿吗? Input 输入金片的个数n。这里的n<=10。 Output 输出搬动金片的全过程。格式见样例。

#include<stdio.h>

void move(char x,char y);

void hanoiInput();

int main()

{

hanoiInput();

return 0;

}

void move(char x,char y)

{

printf("%c==>%c\n",x,y);

}

void hanoi (int n,char one,char two,char three)

{

if(n==1) move(one,three);

else

{

hanoi(n-1,one,three,two);

move(one,three);

hanoi(n-1,two,one,three);

}

}

void hanoiInput()

{

int num;

printf("请输入盘子个数:");

scanf("%d",&num);

printf("个盘子的最佳移动方式为:\n");

hanoi(num,'A','B','C');

}

使用递归调用!

其实你先别管语言实现, 先理解递归思想以后, 再去看代码, 就会好懂了. 可以简单说一下过程:

假设要将N个盘从A移至B柱, C为辅助柱, 过程如下:

假设我们有一个函数, 它能完成M个盘的移动功能, 我们就能完成整个过程,如果有N个盘, 我们可以分别为下面几步:

1, 如果只有一个盘, 就将它直接从源柱移至目标柱, (这个应该好理解, 只有一个盘哦)

否则

2, 将上面的N-1个小盘从源柱(A)移到辅助柱(C)

3, 将最大盘从源柱A移至目标柱B

4, 将上面的N-1个小盘从C柱(原来为辅助柱, 此时它变为源柱)移至目标柱B

每一遍, 我们都能将问题变小, 第一次通过三个动作将N变成N-1(当然变成N-1时我们还是不能直接解,但是还可以向下变小), 一直接下去, 最后肯定能够变成一个盘的情况, 那个就是基础情况, 可以直接解(在本例也就是直接移动了)

上一个:学CAD和C语言适合什么类型的笔记本?
下一个:<<C语言程序设计>>的总结?

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,