本章继续学习递归的应用,用以解决汉诺塔问题。
1.问题描述
有a,b,c三根柱子,将a柱上圆盘移动至c柱上,且只能借助b柱。圆盘的摆放均为上小下大。
2.解题思路
将a上n-1个盘子移动到b柱上
将剩下的那个圆盘移动到c柱上
将n-1个圆盘从b移动到c上
3.抽象化操作
递归一:将多个盘子从一个柱子移到另一个柱子
递归二:移动单个的盘子
4.图示
5.代码实现
核心函数
c版
void hanni(int n,char a,char b,char c)
{
if(n==1)
{
move(a,c);
}
else if(n<=0)
{
printf("error!\n");
}
else
{
hanni(n-1,a,c,b);
move(a,c);
hanni(n-1,b,a,c);
}
}
c++版
void hannoi(int n,char a,char b,char c)
if(n==1){
cout<<"将圆盘"<<n<<"从"<<a<<"移动到"<<c<<endl;
}
else{
hannoi(n-1,a,c,b);
cout<<"将圆盘"<<n<<"从"<<a<<"移动到"<<c<<endl;
hannoi(n-1,b,a,c);
}
}
完整函数
#include<stdio.h>
void move(char a,char b)
{
printf("%c-->%c\r\n",a,b);
}
void hanni(int n,char a,char b,char c)
{
if(n==1)
{
move(a,c);
}
else if(n<=0)
{
printf("error!\n");
}
else
{
hanni(n-1,a,c,b);
move(a,c);
hanni(n-1,b,a,c);
}
}
void test()
{
int i=1;
char a,b,c;
hanni(i,'a','b','c');
printf("****************\r\n");
int n=2;
hanni(n,'a','b','c');
printf("****************\r\n");
int m=3;
hanni(m,'a','b','c');
printf("****************\r\n");
int x=-1;
hanni(x,'a','b','c');
}
int main()
{
test();
return 0;
}