汉罗塔hanoi问题之递归

来源:互联网 发布:音箱测试软件wavetool 编辑:程序博客网 时间:2024/06/10 07:57

三根柱子A、B、C,开始时A柱上有n个盘子,盘子大小不等,大的在下、小的在上。

此时把这n个盘子从A柱移到C柱上,但每次只允许移动一个盘子,且在移动过程序中每根柱子上都始终保持大盘在下、小盘在上。

在移动过程中可以借助B柱,要求:正整数n由键盘输入。


Java实现:

[java] view plain copy print?
import java.util.Scanner;

public class Test160916 {

public static void main(String[] args) {

System.out.println("请输入A塔上盘子的个数");

System.out.println("请输入一个整数后按回车键:");

Scanner scanner = new Scanner(System.in);

int n = scanner.nextInt();

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

scanner.close();
}

public static void move(char x, int n, char y){

System.out.println("把编号为["+n+"]盘从"+x+" 移动到 "+y);

}

public static void hanoi(int n,char A,char B,char C){

if(n==1){

move(A,1,C);

}else{
/* 步骤
* 第一步,移走最上面的盘子,剩下一个最大的
* 第二步,把最大的盘子移到目标盘
* 第三步,移回第一步的盘子到目标盘
*/
hanoi(n-1,A,C,B);//借助 【C】 把n-1个盘从【A】移到 【B】
move(A,n,C);//把最大的盘子移动到【C】
hanoi(n-1,B,A,C);//借助 【A】 把n-1个盘从【B】移到 【C】

}

}


}


输出结果:
请输入A塔上盘子的个数
请输入一个整数后按回车键:
3
把编号为[1]盘从A 移动到 C
把编号为[2]盘从A 移动到 B
把编号为[1]盘从C 移动到 B
把编号为[3]盘从A 移动到 C
把编号为[1]盘从B 移动到 A
把编号为[2]盘从B 移动到 C
把编号为[1]盘从A 移动到 C


C语言实现:
[cpp] view plain copy print?
#include <stdio.h>

void move(char x, int n, char y){
printf("把编号为[%d]盘从 %c 移动到 %c \n",n,x,y);
}
void hanoi(int n,char A,char B,char C){
if(n==1){
move(A,1,C);
}else{
/* 步骤
* 第一步,移走最上面的盘子,剩下一个最大的
* 第二步,把最大的盘子移到目标盘
* 第三步,移回第一步的盘子到目标盘
*/
hanoi(n-1,A,C,B);//借助 【C】 把n-1个盘从【A】移到 【B】
move(A,n,C);//把最大的盘子移动到【C】
hanoi(n-1,B,A,C);//借助 【A】 把n-1个盘从【B】移到 【C】
}
}
int main() {
int n;
printf("请输入A塔上盘子的个数\n");
printf("请输入一个整数后按回车键:\n");
scanf("%d",&n);
hanoi(n, 'A', 'B', 'C');
return 0;
}



输出结果:
请输入A塔上盘子的个数
请输入一个整数后按回车键:
3
把编号为[1]盘从 A 移动到 C
把编号为[2]盘从 A 移动到 B
把编号为[1]盘从 C 移动到 B
把编号为[3]盘从 A 移动到 C
把编号为[1]盘从 B 移动到 A
把编号为[2]盘从 B 移动到 C
把编号为[1]盘从 A 移动到 C


原创粉丝点击