函数递归简单题-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的时候,母牛的数目等于去年的母牛数目+今年生产的母牛数,今年生产的母牛数由题意(小牛过三年能生育)等于三年前的总牛数,过了三年以后当时的牛都能生。

posted @ 2016-03-19 21:20  Wasdns  阅读(702)  评论(0编辑  收藏  举报