1.递归
是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象。在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知。使用递归解决问题,思路清晰,代码少。但是在主流高级语言中(如C语言、Pascal语言等)使用递归算法要耗用更多的栈空间,所以在堆栈尺寸受限制时(如嵌入式系统或者内核态编程),应避免采用。所有的递归算法都可以改写成与之等价的非递归算法。
在编程中,递归是搜索的基础,所以想要学好编程,就要学好递归
我们来做几道经典的题目
1.逆波兰表达式
【题目描述】
逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4。本题求解逆波兰表达式的值,其中运算符包括+ - * /四个。
【输入】
输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。
【输出】
输出为一行,表达式的值。
可直接用printf("%f\n", v)输出表达式的值v。
【输入样例】
* + 11.0 12.0 + 24.0 35.0
【输出样例】
1357.000000
#include<bits/stdc++.h>
using namespace std;
double f()
{
string st;
cin>>st;
if(st[0]=='+') return f()+f();
if(st[0]=='-') return f()-f();
if(st[0]=='*') return f()*f();
if(st[0]=='/') return f()/f();
return atof(st.c_str());
}
int main()
{
printf("%f",f());
return 0;
}
这道题目主要是考察大家对递归基础的掌握
用递归和亿点点思维(小编也是想了很久)就可以做出来了(嘻嘻)
讲一下思路:
如果输入的是*,就返回f()*f()
如果输入的是+,就返回f()+f()
如果输入的是-,就返回f()-f()
如果输入的是/,就返回f()/f()
如果输入的是数字,就返回数字
(大家懂了吗)
2.爬楼梯
【题目描述】
树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数。
例如:楼梯一共有3级,他可以每次都走一级,或者第一次走一级,第二次走两级,也可以第一次走两级,第二次走一级,一共3种方法。
【输入】
输入包含若干行,每行包含一个正整数N,代表楼梯级数,1≤N≤30。
【输出】
不同的走法数,每一行输入对应一行输出。
【输入样例】
5
8
10
【输出样例】
8
34
89
#include<bits/stdc++.h>
using namespace std;
int ppp(int a)
{
int s,d;
if(a==1) return 1;
if(a==2) return 2;
return ppp(a-1)+ppp(a-2);
}
int main()
{
int a;
int i,k;
while(cin>>a)
{
cout<<ppp(a)<<endl;
}
return 0;
}
这道题就不多解释了(这道题太简单了)
大家还可以刷分解因数,菲波那契数列(特别经典呦),Pell数列,2的幂次方表示,等等
//分解因数
#include<iostream>
using namespace std;
int n,m;
int ac(int a,int b)
{
if(a==1) return 1;
if(b==1) return 0;
if(a%b==0) return ac(a/b,b)+ac(a,b-1);
return ac(a,b-1);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>m;
cout<<ac(m,m)<<endl;
}
return 0;
}
//斐波那契数列
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long a,s,d,f,v[100001];
v[1]=1;
v[2]=1;
for(a=3;a<=10000;a++)
{
v[a]=v[a-1]+v[a-2];
}
cin>>s;
for(d=1;d<=s;d++)
{
cin>>f;
cout<<v[f]<<endl;
}
return 0;
}
//pell数列
#include<bits/stdc++.h>
using namespace std;
int s[1000001];
int p(int a)
{
if(s[a]!=0) return s[a];
if(a==1) return s[1]=1;
if(a==2) return s[2]=2;
return s[a]=(2*p(a-1)+p(a-2))%32767;
}
int main()
{
for(int i=1;i<=1000000;i++) p(i);
int n,m;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>m;
cout<<s[m]<<endl;
}
return 0;
}