函数递归简单题-hdoj-2044 2018-一只小蜜蜂 母牛的故事
题目:一只小蜜蜂
递归做法:
#include<cstdio>
#include<iostream>
#include<stdlib.h>
#include<stack>
#include<string>
using namespace std;
int cnt=0;//count
int a,b;
//int flag=0;
int tran[3]={1,2};//坐标移动
void done(int x)
{
int begin=0,bet=0;
begin=x;
if(begin>b)return ;//越界
if(begin==b)
{
//cout<<"1"<<endl;
cnt++;
return ;
}//到达终点
else
{
for(int i=0;i<2;i++)
{
bet=begin+tran[i];//移动位置
done(bet);
//cout<<"2"<<endl;
}
}
return ;
}
int main()
{
int n;
int i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d%d",&a,&b);
done(a);
printf("%d\n",cnt);
cnt=0;
flag=0;
}
return 0;
}
一题递归类型的题目,比较简单。我犯了两个粗心的错误,一个是终点判断使用了a,还有一个是main函数里面的输入格式写错了...也感谢兴桔的讲解。
贴上兴桔ppt的一部分,和函数递归的模板和深度优先搜索有关系。
这题是规律题,用平常的递归会T,规律能看出符合斐波那契数列,所以这里给出它的做法。
#include<stdio.h>
#include<string.h>
using namespace std;
int main()
{
long long int f[55];
f[1]=1;
f[2]=2;
for(int i=3;i<55;i++)
{
f[i]=f[i-1]+f[i-2];
}
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
printf("%lld\n",f[m-n]);
}
}
参考博客:杭电2044一只小蜜蜂
博主的公告也很有意思:“屌丝分为两种,一种是没有梦想,浑噩一生的屌丝,另一种是怀揣着梦想,奋斗一生的屌丝。”
题目:母牛的故事
代码:
#include<cstdio>
#include<iostream>
#include<stdlib.h>
using namespace std;
int done(int x)
{
int c;
if(x<=3) c=x;
else c=done(x-1)+done(x-3);
return c;
}
int main()
{
int n;
int tot=0;
while(scanf("%d",&n)!=EOF)
{
if(n==0)break;
tot=done(n);
printf("%d\n",tot);
tot=0;
}
return 0;
}
解释一下递归的语句:
int done(int x)
{
int c;
if(x<=3) c=x;
else c=done(x-1)+done(x-3);
return c;
}
从第n年开始往回找到第一年,前3年牛的数目是按+1的规律来递增的,当年数大于3的时候,母牛的数目等于去年的母牛数目+今年生产的母牛数,今年生产的母牛数由题意(小牛过三年能生育)等于三年前的总牛数,过了三年以后当时的牛都能生。
To improve is to change, to be perfect is to change often.