牛生牛 (好难)

languagec 2003-12-07 05:38:23
从前有一个农夫养了一只
牛。
这只牛4年后每年生一只母牛,小母牛过4年,同样每年生一只母牛。
问题出来了……
过了20年,这个农夫有了几只牛呢?(当然20年后老牛都还活着,其他牛也没有伤亡)

谁能给出一个简明,清爽的递归程序呢?
...全文
303 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenyan800522 2003-12-09
  • 打赏
  • 举报
回复
支持一下:Top

cxjddd(空浮无根)兄的算法是正确的,正确结果应该是345,下面是南京理工某硕士的算法:
#include <stdio.h>

int jisuan(int nian)
{
int niu;
if(nian < 4)
niu = 1;
else
niu = jisuan(nian - 1) + jisuan(nian - 4);
return niu;
}

main()
{
int nn = jisuan(20);
printf("%d niu",nn);

}

languagec 2003-12-09
  • 打赏
  • 举报
回复
: sokewoniu(缩壳蜗牛) 125
: matin1984() ( ) 8
: sokewoniu(缩壳蜗牛) 41
: inline(虚函数) ( ) 2745
: SoRoMan(将爱灌到人间,就象把分撒向CSDN..) ( ) 872
: zhtgong(zht) ( ) 872
: chenyan800522(风无言) 345
: languagec(各有所求) ( ) 1 ,250 , 872 (就是本人自己啊)
经调试,以给出各位代码的运算结果,其中三人所得答案一致,其他各不相同……

languagec 2003-12-09
  • 打赏
  • 举报
回复
弄错!
隔3年后开始生牛 ,应该是 year=year+3;
运行结果872
languagec 2003-12-09
  • 打赏
  • 举报
回复
#define n 20
int s=1;
int cow(int year)
{
year=year+4;
while(1)
{
if(year>n) return 0;
s=s+1+cow(year);
year++;
}
}
main()
{
cow(1);
printf("%d\n",s);

}
我算出来了是 250.
牛4年后生开始生牛,就是隔3年后开始生.算出来的答案与大家的相去甚远.
visio 2003-12-08
  • 打赏
  • 举报
回复
想法和inline(虚函数)一样,不过答案我就没有
glacierrr 2003-12-08
  • 打赏
  • 举报
回复
先顶一下,回去慢慢做做
languagec 2003-12-08
  • 打赏
  • 举报
回复
原来早就有人问过了啊!
其实这个问题是我们大一的C语言书上的一个题目,我大一的时候就开始考虑了,我想应该用递归,但总感觉思路很乱。想不到很多同志早就提过这个问题了,我却没看到。
cxjddd 2003-12-08
  • 打赏
  • 举报
回复
理解不一样,做得不同
/*
1 1 1 1 2 3 4 5 7 ...
*/
int
niu (int n)
{
if (n <= 4)
return 1;
else
return niu (n - 1) + niu (n - 4);
}
fiveyes 2003-12-08
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2058/2058976.xml?temp=.5746118

http://expert.csdn.net/Expert/topic/2089/2089117.xml?temp=.489773

http://expert.csdn.net/Expert/topic/2292/2292530.xml?temp=.5806848

http://expert.csdn.net/Expert/topic/2454/2454785.xml?temp=.4322779
zhtgong 2003-12-08
  • 打赏
  • 举报
回复
我把几个变量写错了,现在改回来
#include<stdio.h>



int cow(int n)
{if(n<=3) return(1);
else return(cow(n-1)+cow(n-3));}



void main(void)
{

int x;
int m;
printf("intput the year\n");
scanf("%d",&x);
m=cow(x);
printf("%d",m);}


tc.2.0 结果872
languagec 2003-12-08
  • 打赏
  • 举报
回复
double s=1;
int cow(int year)
{
int n,i;
n=20-year-4+1;
i=year+3;
if(i<n)
return 1;
else
{
for(;i<n;i++)
{
s=s+1+cow(i);
}
return s;
}
}
main()
{
double n;
n=cow(1);
printf("%f",n);
}


这是我自己写的,没有仔细的考虑细节。
我是想只要写出第一只牛的情况,让后来出生的牛再重复第一只牛那样的计算就行了。
第一只牛过4年后每年生一只母牛,就是要产生20-year-4+1个 cow(year).
算出来结果是1,见笑了。
希望大家能以这样的形式写个来,能指出我的程序的不足之处,万分感谢!
说好了,要用50分砸死递归的!
cyj2008 2003-12-08
  • 打赏
  • 举报
回复
这道题不就是Febonaci问题的变种么?????
herohero55 2003-12-08
  • 打赏
  • 举报
回复
这个问题我以前做过,做了一个星期,大家把题看清
不是那么简单的,
我没做出来
嘿嘿
不好意思
zhtgong 2003-12-08
  • 打赏
  • 举报
回复
#include<stdio.h>



int cow(int n)
{if(n<=3) return(1);
else return(cow(n-1)+cow(n-3));}



void main(void)
{

int x;
int m;
printf("intput the year\n");
scanf("%d",&n);
m=cow(n);
printf("%d",m);}


tc.2.0 结果872
Sodier 2003-12-08
  • 打赏
  • 举报
回复
上面的4岁指的是4所或4岁以上
Sodier 2003-12-08
  • 打赏
  • 举报
回复
代码自己写吧
如果在4岁的时候生小牛
则递推关系为:a[n]=a[n-1]+a[n-3]
Sodier 2003-12-08
  • 打赏
  • 举报
回复
(假设4岁的牛在5岁的年初生小牛)
假设第n年年初有1岁的牛a只,2岁的牛b只,3岁的牛c只,4岁的牛d只
则第n+1年年初有1岁的牛d只,2岁的牛a只,3岁的牛b只,4岁的牛c+d只
第n+2年年初有1岁的牛c+d只,2岁的牛d只,3岁的牛a只,4岁的牛b+c+d只
第n+3年初有1岁的牛b+c+d只,2岁的牛c+d只,3队的牛a只,4岁的牛a+b+c+d只
列成表格如下:
1岁 2岁 3岁 4岁
a[n] a b c d
a[n+1] d a b c+d
a[n+2] c+d d a b+c+d
a[n+3] b+c+d c+d d a+b+c+d
从上面的表格中可以得到一下结论:
a[n+3]时4岁的牛是a[n]时总共的牛
即上面的d=a[n-3]
a[n+1]-a[n]=d=a[n-3]
所以a[n+1]=a[n]+a[n-3]
即a[n]=a[n-1]+a[n-4]
这就是递推关系
前几年的牛给出:1,1,1,1,2,3,4,5,7.......
从第5年起的牛可以根据地推关系来算。
fuzq 2003-12-08
  • 打赏
  • 举报
回复
闷,,
哪有那么多的公牛来^%#^¥&^%×&
mryyzx 2003-12-07
  • 打赏
  • 举报
回复
查那个生兔子的著名问题,这是那个的变体。基本好象是算法书都有生兔子的叠代的问题。
languagec 2003-12-07
  • 打赏
  • 举报
回复
看来大家的答案是五花八门,算法也是众说纷纭,莫衷一是啊。
经调试 SoRoMan(将爱灌到人间,就象把分撒向CSDN.) 的结果是872 (环境是tc 2.0)
而 inline(虚函数) 似乎说得很果断2745
我也六神无主不知道该信谁啊。




加载更多回复(18)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧