今天学了递归算法,下面的题目是对递归的理解
&1.问第n个学生多大
题目描述
例2.1有n个学生坐在一起
问第n个学生多少岁?他说比第n-1个学生大2岁.
问第n-1个学生岁数,他说比第n-2个学生大2岁.
..........................................................
问第2个学生,说比第1个学生大2岁.
最后问第1个学生,他说是10岁.
请问第n个学生多大?
输入
输入n
输出
输出第n个学生的年龄
样例输入
5
样例输出
18
思路:(关键点为第一个学生的年龄)
第1个学生年龄为10岁(往后每个学生比前一个学生大两岁)
n age
1 10 (当n=1时age=10,这个条件要单独列出)
2 age(2-1)+2
3 age(3-1)+2
... ...
n age(n-1)+2
#include<iostream> using namespace std; int fac(int a) { int age; if(a==1){return age=10;} else return fac(a-1)+2; } int main() { int n; cin>>n; cout<<fac(n)<<endl; return 0; }
&2.Fibonacci
题目描述
Ø例5.2 求Fibonacci数列问题。
─斐波那契数列指的是这样一个数列:
─0、1、1、2、3、5、8、13、21、……
─F[0]=0, F[1]=1, F[i]=F[i-1]+F[i-2], i>=2;
编程输出前n个Fibonacci数
输入
输入n
输出
输出前n个Fibonacci数
样例输入
5
样例输出
0
1
1
2
3
思路:
F[5]=F[4]+F[3];
F[4]=F[3]+F[2];
F[3]=F[2]+F[1];
F[2]=F[1]+F[0];(到这里结束,并且F[1].F[2]的值知道,故先分情况讨论)
#include <iostream> using namespace std; int f(int x) { if(x == 0){ return 0; } else if(x == 1){ return 1; } else return f(x-1)+f(x-2); } int main(){ int n; cin >> n; for(int i = 0; i < n; i++) { cout << f(i) << endl; } return 0; }
&3.汉诺塔问题
题目描述
汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有n个盘子,盘子大小不等,大的在下,小的在上(如图)。有一个和尚想把这n个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求打印移动的步骤。如果只有一个盘子,则不需要利用B座,直接将盘子从A移动到C。
输入
输入盘子个数n
输出
输出盘子最少移动的步骤
样例输入
3
样例输出
1:A->C
2:A->B
3:C->B
4:A->C
5:B->A
6:B->C
7:A->C
思路:
(设A中有n个堆叠的木块,将n-1个看成整体,将第n个看成另一个整体)
第一步:将n-1从A移到B中,此时n仍在A中;
第二步:将A中的n移到C中,n-1不动;
第三步:将B中的n-1移到C中,此时完成堆塔。
#include<iostream> using namespace std; int i=1; void hannoi(int n,char a,char b,char c) { if(n==1) { cout<<i<<":"<<a<<"->"<<c<<endl; i++; } else { hannoi(n-1,a,c,b); cout<<i<<":"<<a<<"->"<<c<<endl; i++; hannoi(n-1,b,a,c); } } int main() { int n; char one='A',two='B',three='C'; cin>>n; hannoi(n,one,two,three); return 0; }
来源:https://www.cnblogs.com/bearkid/p/6579693.html