7月31日,晴。“递归方便耗内存,来去自在汉诺塔“。
递归与非递归哪个省内存?
我本是西海龙王敖闰之子,唤名龙马三太子,驮师父往西天拜佛。我来做一道简单的。
例9 非负数n的阶乘,按以下公式
#include<stdio.h>
int fn(int n) {
if(n==0)//递归终止条件
return 1;
else//递归通式
return n*fn(n-1);
}
int main() {
int n;
printf("请输入1个整数:");
scanf("%d",&n);
printf("%d!的阶乘是%d\n",n,fn(n));
return 0;
}
有一个梵塔-汉诺塔,塔内有三个座A、B、C,A座上有诺干个盘子,盘子大小不等,大的在下,小的在上。把这些个盘子从A座移到C座,中间可以借用B座但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。
分析:描述简化---把A柱上的n个盘子移动到C柱,其中可以借用B柱。
1、任务分析
2、算法构思
任务1、把A上的n-1个盘子移动到B: Hanoi (n-1,a,c,b); // 操作结束为状态1
任务2、把A上的大盘子移动到C move(a,c)
任务3、把B上的n-1移动到A Hanoi (n-1,b,c,a); //操作结束位状态2(和状态1相比只是规模变小)
3、代码实现有了神仙姐姐的分析,俺沙悟净写一下代码:
#include <iostream>
using namespace std;
void Hanoi(int n, char src,char mid,char dest)
//将src座上的n个盘子,以mid座为中转,移动到dest座
{
if( n == 1) { //只需移动一个盘子
cout << src << "->" << dest << endl; //直接将盘子从src移动到dest即可
return ; //递归终止
}
Hanoi(n-1,src,dest,mid); //先将n-1个盘子从src移动到mid
cout << src << "->" << dest << endl; //再将一个盘子从src移动到dest
Hanoi(n-1,mid,src,dest); //最后将n-1个盘子从mid移动到dest
return ;
}
int main() {
int n;
cin >> n; //输入盘子数目
Hanoi(n,'A','B','C');
return 0;
}