递归在做题中十分常用,往往一些复杂的问题,涉及循环的问题都可以被设计为递归,并用递归很完美的解决。
递归的思想可以与高中所学的数学归纳法相结合。
递归可以归纳为:
设计P1函数,并判断是否成立。
设计Pk函数,证明如果Pk成立,那么P(k+1)也成立。
最后结合前两步写出完整递归。
目录
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;
}
至此,这篇文章分享就结束了,希望这篇文章对大家能有一些帮助。