汉诺塔问题的求解程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.基于汉诺塔问题的求解程序,分别使用全局变量和局部变量来计算当塔中有
n个盘子时需要进行多少步的盘子移动次数(例如当塔中有5个盘子时,需要移动31次)。提示:当使用局部变量时,函数的原型可以为 long hanoi(int ,char,char,char),该函数的功能是完成hanoi塔的移动并返回其执行步数。
方法一:使用局部静态变量
#include
long hanoi(int n,char one, char two, char three)
/*该函数计算移动盘的步骤并返回移动步数 */
{
static long int count=0;
/* 定义静态局部变量count,用以计算总共移动他多少次 */
if(n==1)
{
printf("move %c--> %c\n",one, three);
count++;
}
else
{
hanoi(n-1,one,three,two);
printf("move %c--> %c\n",one, three);
count++;
hanoi(n-1,two,one,three);
}
return(count);
}
void main()
{
int m=0;
long int steps; /*定义长整型变量step用来装载hanoi函数的返回值*/
printf("please input the number of diskes:");
scanf("%d",&m);
printf("the steps are following:\n");
steps=hanoi(m,'A','B','C');
printf("They need %ld steps to move\n",steps);
}
方法二:使用一般局部变量
#include
long hanoi(int n,char one, char two, char three)
/*该函数计算移动盘的步骤并返回移动步数 */
{
long int count1=0, count2=0;
/* 定义局部变量count1,count2 */
if(n==1)
printf("move %c--> %c\n",one, three);
else
{
count1=hanoi(n-1,one,three,two);
printf("move %c--> %c\n",one, three);
count2=hanoi(n-1,two,one,three);
}
return(count1+count2+1);
}
void main()
{
int m=0;
long int steps; /*定义长整型变量step用来装载hanoi函数的返回值*/ printf("please input the number of diskes:");
scanf("%d",&m);
printf("the steps are following:\n");
steps=hanoi(m,'A','B','C');
printf("They need %ld steps to move\n",steps);
}
方法三:使用全局变量
#include
long count=0;/*定义全局变量来统计移动步数 */
void hanoi(int n,char one, char two, char three)
/* 该函数计算移动盘的步骤*/
{
if(n==1)
{
printf("move %c--> %c\n",one, three);
count++;
}
else
{
hanoi(n-1,one,three,two);
printf("move %c--> %c\n",one, three);
count++;
hanoi(n-1,two,one,three);
}
}
void main()
{
int m=0;
printf("please input the number of diskes:"); scanf("%d",&m);
printf("the moving steps are following:\n"); hanoi(m,'A','B','C');
printf("They need %ld steps to move\n",count); }