# 蓝桥杯之递归算法

#include<iostream>
#include<string>

using namespace std;

void g(string s);
int main(){
string s;
cin >> s;
g(s);
return 0;
}

void g(string s){

if(s.size()>1){
g(s.substr(1,s.size()));
}
cout << s[0];
}
----------------------------------------------------------

[2.5 真题 振兴中华]

#include<cstdio>

int g(int a,int b);
int main(){
printf("%d",g(5,4));
return 0;
}

int g(int a,int b){

if(a==1 || b==1){
return 1;
}
return g(a-1,b) + g(a,b-1);

}

----------------------------------------------------------

[2.6 真题 出栈顺序]

X星球特别讲究秩序，所有道路都是单行线。

X星球太死板，要求每辆路过的车必须进入检查站，也可能不检查就放行，也可能仔细检查。

#include<cstdio>

int g(int a,int b);
int main(){
printf("%d",g(16,0));
}

int g(int a,int b){
if(a==0) return 1;
if(b==0) return g(a-1,1);
return g(a-1,b+1) + g(a,b-1);
} 
----------------------------------------------------------

1 2 3 4 5 6 7 8 9 = 110

12+34+56+7-8+9
123+4+5+67-89

#include<cstdio>
#include<cstring>
#include<cstdlib>

using namespace std;
void g(int a[],int n,char s[],int sum);
int main(){
int a[9]={1,2,3,4,5,6,7,8,9};
char t[]="";
g(a,8,t,110);
}

void g(int a[],int n,char s[],int sum){
if(n==0){
if(a[0]==sum){
char t[10];
sprintf(t,"%d%s",a[0],s);
printf("%s\n",t);
}
return;
}
char tmp[20];
sprintf(tmp,"%c%d%s",'+',a[n],s);
g(a,n-1,tmp,sum-a[n]);
sprintf(tmp,"%c%d%s",'-',a[n],s);
g(a,n-1,tmp,sum+a[n]);

int old = a[n-1];

char num[10];
sprintf(num,"%d%d",a[n-1],a[n]);

a[n-1]=atoi(num);
g(a,n-1,s,sum);
a[n-1]=old;
}
----------------------------------------------------------

<自己编写版>
#include<cstdio>

void g(int i,int step,int n);
int count=0;

int main(){
g(0,0,0);
printf("%d",count);
}

void g(int i,int step,int n){
if(n==39){
if(step%2==0){
count++;
return;
}
}

if(n>39) return;

g(2,step+1,n+2);
g(1,step+1,n+1);
}
<版本2>
#include<cstdio>

int g(int i,int step,int n);
int count=0;

int main(){
count=g(0,0,0);
printf("%d",count);
}

int g(int i,int step,int n){
if(n==39){
if(step%2==0){
return 1;
}
}

if(n>39) return 0;

return g(2,step+1,n+2)+g(1,step+1,n+1);
}
<互相递归调用版（不太懂）>
#include<cstdio>

int g1(int n);
int g2(int n);

int main(){
printf("%d\n",g2(39));
}

//奇数
int g1(int n){
if(n==0){
return 0;
}
if(n==1){
return 1;
}

return g2(n-1)+g2(n-2);
}

//偶数
int g2(int n){
if(n==1){
return 0;
}
if(n==0){
return 1;
}

return g1(n-1)+g1(n-2);
}
----------------------------------------------------------

m>=n的时候，有些情况也不行。比如，第一个购票的乘客就持有1元。

#include<cstdio>

int g(int a,int b){

if(a<b) return 0;
if(a==1) return 1;
if(b==0) return 1;

return g(a-1,b)+g(a,b-1);

}

int main(){
printf("%d",g(5,2));
}