一、经典递归问题
1、汉诺塔问题
题目描述:古代有一个梵塔,塔内有三个座 A、B、C,A 座上有 64 个盘子,盘子大小不等,大的在下,小的在上。有一个和尚想把这 64 个盘子从 A 座移到 B 座,但每次只能允许移动一个盘子,并且在移动过程中,3 个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用 B 座,要求打印移动的步骤。如果只有一个盘子,则不需要利用 B 座,直接将盘子从 A 移动到 C。
现在有 n 个圆盘从上往下从小到大叠在第一根柱子上,要把这些圆盘全部移动到第三根柱子要怎么移动呢?请找出需要步骤数最少的方案。
分析:现在我们要将 n 个盘子移到第三个塔上,假如我们将 n-1 个移到第二个。再将剩下的一个移到第三个。最后把 n-1 个移回第三个上。
令 Hanno(n,Ta,Tb Tc) 表示借助 Tb 塔,把 n 个盘子,从 Ta 塔移到 Tc 塔。那么根据问题分解可知
Hanno(n,Torigin,Temp,Tdes)可以分解为
Hanao(n-1,Torigin,Tdes,Temp); //借助Tdes,把n-1个盘子,从Torigin移到Temp
move(1,Torigin,Tdes);//把剩下的一个盘子移到Tdes
Hanno(n-1,Temp,Torigin,Tdes)//记住Torigin,把Temp中剩下的n-1个盘子移到Tdes,至此问题得以解决。
三步实现,问题已经解决
当n=1时,直接移动,move(Ta,Tc)//结束条件
实现代码
#include<iostream>
using namespace std;
int i=0;
void move(char Ta,char Tb){
cout<<"第"<<i<<"步:"<<"盘子从"<<Ta<<"----->"