上机内容:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。
古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。
有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,
3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,下面左图给出了移动方法的提示。
请编制递归函数输出盘子数为4时(程序调试后,试试15个、20个,直至64个,看看会如何),移动的方案。
右图为盘子数为3时的输出供参考。
上机目的:递归函数编程练习
我的程序:
运行结果:
古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。
有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,
3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,下面左图给出了移动方法的提示。
请编制递归函数输出盘子数为4时(程序调试后,试试15个、20个,直至64个,看看会如何),移动的方案。
右图为盘子数为3时的输出供参考。
上机目的:递归函数编程练习
我的程序:
/*
* 程序的版权和版本声明部分:
* Copyright (c) 2013, 青岛农业大学理信学院
* All rights reserved.
* 文件名称:汉诺塔.cpp
* 作 者:幻影行者
* 完成日期:2013 年 8 月 5 日
* 版 本 号:v1.0
* 对任务及求解方法的描述部分:
* 问题描述:如上
*/
#include<iostream>
using namespace std;
void plate_move(int plate_num,char a,char b,char c); //函数声明,将数量为plate_num的盘子从a座经b座移动到c座
int main()
{
int n;
cout<<"输入移动的盘子数:"<<endl;
cin>>n;
cout<<"移动的方案为:"<<endl;
plate_move(n,'a','b','c');
return 0;
}
void plate_move(int plate_num,char a,char b,char c)
{
if(plate_num==1)
{
cout<<a<<"--->"<<c<<endl;
return;
}
else
{
plate_move(plate_num-1,a,c,b); //先将数量为plate_num-1的盘子从a座经c座移动到b座
cout<<a<<"--->"<<c<<endl; //再将剩下的一个盘子从a座移动到c座
plate_move(plate_num-1,b,a,c); //然后将数量为plate_num-1的盘子再从b座经a座移动到c座,递归,完成移动
return;
}
}
运行结果: