提到递归,就不得不提一个经典问题——汉诺塔问题。
汉诺塔问题
古代有一个樊塔,塔内有三个座A、B、C,A座上有n个盘子,盘子大小不等,大的在下,小的在上(如图)。但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求输出移动的步骤。
#include<stdio.h>
#include<iostream>
using namespace std;
void Hanoi(int n,char A,char B,char C){//将"A"座上的n个盘子,以"B"座为中转,移动到"C"座
if(n==1){//只有一个盘子需要移动时
cout<<A<<"->"<<C<<endl;//直接将盘子从"A"移动到"C"即可。
return;//递归终止出口
}
Hanoi(n-1,A,C,B);//先将n-1个盘子从"A"移动到"B"
cout<<A<<"->"<<C<<endl;//再将目前最大的那个盘子从"A"移动到"C"
Hanoi(n-1,B,A,C);//最后将n-1个盘子从"B"移动到"C"
return;
}
int main(){
int n;
cin>>n;
Hanoi(n,'A','B','C');
getchar();
getchar();
return 0;
}
具体分析注释很清楚了