递归的讲解与练习

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;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值