汉诺塔的递归应用

来源:互联网 发布:枪神纪刷枪软件2016 编辑:程序博客网 时间:2024/06/05 02:25

声明:发博客只是为了个人的学习,很欢迎并且也希望得到各位大神的指点,如果有萌新看到这篇文章,如果我发的这些东西能够帮助到您的话,我很开心

 所谓的汉诺塔问题是说假设有三个塔,其中第一个塔内有N个由小到大的圆盘,由上到下地依次叠好,如果要将其中的圆盘按照排列方式移到三个塔上,且需要遵循以下的规则:

1.一次只能搬一个,且只能搬最上面的

2.大的圆盘不能叠加到小圆盘上

在移动的过程中,可用第2个做为中继站,试问如何用程序输出所有的移动步骤?

如果你对此递归有些陌生的话,不妨先来熟悉一下递归

首先,我们用一个简单的例子用说一下递归

假设一个人是16岁,一共有五个人,每一个都比前一个大2岁,求第五个人的年龄

#include<stdio.h>
int old(int x)
{
int n;
if(x==1)
return n=16;
else
return n=2+old(x-1);
}


main(void)
{
printf("%d\n",old(5));

聪明的你一定能看懂了这个简单的递归,好,下面让我们开始做这道题汉诺塔题,开始巩固和练习

code:

#include<stdio.h>
int tower[3]={1,2,3};
void swap(int x,int begin,int mid,int end)
{
if(x==1)
printf("move %d plate from %d tower to %d tower\n",x,tower[begin],tower[end]);
else
{
swap(x-1,begin,end,mid);
printf("move %d plate from %d tower to %d tower\n",x,tower[begin],tower[end]);
swap(x-1,mid,begin,end);
}
}

main(void)
{
int i;
scanf("%d",&i);
swap(i,0,1,2);
}