入门--递归

   递归在做题中十分常用,往往一些复杂的问题,涉及循环的问题都可以被设计为递归,并用递归很完美的解决。

    递归的思想可以与高中所学的数学归纳法相结合。

    递归可以归纳为:

    设计P1函数,并判断是否成立。

    设计Pk函数,证明如果Pk成立,那么P(k+1)也成立。

    最后结合前两步写出完整递归。

目录

1.经典的猴子吃桃问题

2.弹簧板

3.指数型枚举


1.经典的猴子吃桃问题

首先,确立函数f(n),吃n天桃子的总数。然后确定n=1时,桃子数为1。

第三步确立当n>=2时,f(n)=(f(n-1)+1)*2。

完整代码如下:

#include <iostream>
using namespace std;
int f(int n)
{
if(n==1)   return 1;
return (f(n-1)+1)*2;
}
int main()
{
int n;
cin>>n;
cout<<f(n)<<endl;
}

2.弹簧板

 

首先,先确立第一个函数f(k),表示小球从k位置开始被弹出的次数。

第二步,确立当k大于等于输入的次数n时,即k>=n时,函数值为零。

第三步,当k小于n时确立条件为f(k)=(f(k+a[k])+1。

完整代码为:

#include <iostream>
#include <vector>
using namespace std;
int f(int k,vector<int> &a,int n)
{
if(k>=n)  return 0;
return f(k+a[k],a,n)+1;
}
int main()
{
int n;
vector<int> a;
cin>>n;
for(int i=0,s;i<n;i++)
{
   cin>>s;
    a.push_back(s);
}
cout<<f(0,a,n)<<endl;
}

3.指数型枚举

 首先,题目字典顺序枚举。

然后我们来第一步,f(i,j,n)表示当前在第i个位置,j表示我们能最小放置的数字,n表示我们最大能放置的数。

第二步,判断终止条件,本题的终止条件吧不难看出,每当我们放置的最小数字大于最大数字时,

枚举结束。

第三步,f(i,j,n)我们可以把它当作一个集合,f(i,j,n)就是当前位置选取了j之后再加上f(i+1,j+1,n)这个集合,还有选取了j+1后加上f(i+1,j+2,n)这个集合。依次类推,直到到达终止条件。

完整代码:

#include <iostream>
#include <string>
#include<vector>
using namespace std;
int arr[10];
void printfoneresult(int i){
	for(int l=0;l<=i;l++)
	{
		if(l) cout<<" ";
		cout<<arr[l];
	}
	cout<<endl;
}
void f(int i,int j,int n){
	if(j>n) return ;
	for(int k=j;k<=n;k++)
	{
		arr[i]=k;
		printfoneresult(i);
		f(i+1,k+1,n);
	}
	return ;
}
int main()
{
	int n;
	cin>>n;
	f(0,1,n);
	return 0;
}

至此,这篇文章分享就结束了,希望这篇文章对大家能有一些帮助。 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值