1.什么是递归?
一说起递归,我想每个人都不陌生。举个从小就听过的例子:从前有座山,山里有座庙,庙里有个和尚,和尚在讲故事,从前有座山,山里有座庙,庙里有个和尚,和尚在讲故事,从前有座山…
递归是一定要有终止条件的,不然你电脑会炸掉的
还有你从两面相对的镜子中看到的画面,其实都是抽象出来的递归现象,但是严格来说并不是递归,因为会一直重复下去,没有终止条件,那就称为死循环了。有关递归和死循环的异同我们之后会说到,那么现在先来了解一下什么是递归?
那么什么是递归呢? 要理解递归,就得先了解什么是递归,实际上这句话就是一个递归。这么说可能不好理解,给出代码就好说了
这严格来说不是递归,而是一个死循环
int main(){
cout<<"什么是递归?"<<endl;
cout<<"问s吧";
s("什么是递归?");
}
void s(string a){
cout<<"我不知道"<<a<<",还是问s吧";
s("什么是递归?");
}
//什么是递归?问s吧,我不知道什么是递归,还是问s吧。我不知道什么是递归。。。。。。
应用
斐波拉契数列
#include <iostream>
using namespace std;
long long f(int a){
return f(a-1)+f(a-2);
if(a<=2){
return 1;
}
}
//斐波那契数列 1 1 2 3 5 8 每一(>2)个为 前两个数之和 1和2输出1
3.例题
最大公约数
题目描述
给定两个正整数,求它们的最大公约数。
输入描述
输入一行,包含两个正整数(<1,000,000,000)。
输出描述
输出一个正整数,即这两个正整数的最大公约数。
样例
输入
6 9
输出
3
代码:
#include <iostream>
using namespace std;
int gcd(int a,int b)
{
if(a%b==0) return b;
else gcd(b,a%b);
}
int main()
{
int a,b;
cin>>a>>b;
cout<<gcd(a,b);
return 0;
}
2.汉诺塔
题目描述
设有n个大小不等的中空圆盘,按照从小到大的顺序叠套在立柱A上,另有两根立柱B和C。现在要求把全部圆盘从A柱(称为源柱)移到C柱(称为目标柱),移动过程中可借助B柱(称为中间柱)。移动时有如下的要求:
1) 一次只许移动一个盘。
2) 任何时候、任何柱子上不允许把大盘放在小盘上边
3) 可使用任意一根立柱暂存圆盘。
问:如何用最少步数实现n个盘子的移动?请打印出具体的移动方案
输入描述
一行一个正整数n,1<=n<=18
输出描述
输出若干行,第i行表示第i布的移动方案
样例
输入
3
输出
A->C
A->B
C->B
A->C
B->A
B->C
A->C
思路:
这道题非常经典,我们从简单入手,如果只有两个盘子,会怎么样?
将小盘子移到B柱
大盘子移到C柱
小盘子移到C柱
三个盘子:
最小盘子移到C柱
中盘子移到B柱
小盘子移到B柱
大盘子移到C柱
小盘子移到A柱
中盘子移到C柱
小盘子移到C柱
代码:
#include<iostream>
using namespace std;
void hanoi(char a,char b,char c,int n){
if (n==1) cout<<a<<" -> "<<c<<endl; //直接移动到C柱,输出
else {
hanoi(a,c,b,n-1); //把上面n-1个移到B柱
cout<<a<<" -> "<<c<<endl; //输出
hanoi(b,a,c,n-1); //把剩下n-1个从B柱移到C柱
}
}
int main(){
int n;
cin>>n;
hanoi('A','B','C',n);
}