1.递归:直接或间接调用自身的算法称为递归算法。
2.递归函数
(1)阶乘函数:n!=n*(n-1)*(n-2)*...*2*1。
当n=0时,n!=1; 当n>0时,n!=n(n-1)!
#include<iostream>
using namespace std;
int fun(int n){
if(n==0){
return 1;
}else{
return n*fun(n-1);
}
}
int main(){
int n,res;
cin>>n;
res=fun(n);
cout<<res;
return 0;
}
(2)斐波那契数列:无穷数列1,1,2,3,5,8,13,21,34,55...
当n=1或n=2时,F(n)=1;当n>2时,F(n)=F(n-1)+F(n-2)
//方法一:
#include<iostream>
using namespace std;
int fun(int n){
if(n==1 || n==2){
return 1;
}else{
return fun(n-1)+fun(n-2);
}
}
int main(){
int n,res;
cin>>n;
res=fun(n);
cout<<res;
return 0;
}
//方法二:
#include<iostream>
using namespace std;
int main(){
int n,s1,s2,s3,i=3;
cin>>n;
s1=1;
s2=1;
while(i<=n){
s3=s1+s2;
s1=s2;
s2=s3;
i++;
}
cout<<s3;
return 0;
}
(3)排列问题:例:5个数的排列组合,一共有120中不同的组合。
#include<iostream>
using namespace std;
void swap(int *a,int m,int n){
int k=a[m];
a[m]=a[n];
a[n]=k;
}
void fun(int *arr,int p,int q){//p起始下标,q终止下标
if(p==q){
for(int i=0;i<5;i++){
cout<<arr[i];
}
cout<<endl;
}else{
for(int j=p;j<=q;j++){
swap(arr,p,j);
fun(arr,p+1,q);
swap(arr,p,j);
}
}
}
int main(){
int a[5]={1,2,3,4,5};
fun(a,0,4);
return 0;
}
(4)Hanoi塔问题
#include<iostream>
using namespace std;
void move(char a,char b){
cout << a << "->" << b << endl;
}
void hanoi(int n,char a,char b,char c){
if(n>0){
hanoi(n-1,a,c,b);
move(a,b);
hanoi(n-1,c,b,a);
}
}
int main(){
int m;
cin >> m;
hanoi(m,'a','b','c');
}
(5)整数划分问题:将正整数n表示成一系列的正整数之和,n=n1+n2+......+nk,计算正整数的划分数有多少。
#include<iostream>
using namespace std;
int fun(int n,int m){
if(n<1 || m<1){
return 0;
}
else if(n==1 || m==1){
return 1;
}
else if(n<m){
return fun(n,n);
}
else if(n==m){
return fun(n,m-1)+1;
}
else{
return fun(n-m,m)+fun(n,m-1);
}
}
int main(){
int n;
cin>>n;
int res = fun(n,n);
cout<<res;
return 0;
}