C语言递归的方法:有一对兔子,从出生后第3个月起每个月都生一对兔子的问题

C语言递归的方法:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问36个月的兔子总数为多少?请一定要递归的方法.网上的三个方法我也查过.谢谢了.

可以考虑递归算法:

int Amount(int day)
{
if (day==10)
{
return 1;
}
else
{
return 2*(Amount(day-1)+1);
}
}

早说嘛。。。害的白写了个。。

这题可以多用几个递归函数解决,在这里我称不能生育的兔子为小兔,能生育的为大兔

int littleR(int month)
{
if (month==1)
return 0;
else
return bigR(month-1)+little(month-1);
}
int bigR(int month)
{
if (month==1)
{
return 1;
}
else if (month==2)
{
return 1;
}
else if (month==3)
{
return 1;
}
else
{
return bigR(month-1)+little(month-2);
}
}
int totalR(int month)
{
return littleR(month)+bigR(month);
}

注:这种增长速度的话很快兔子的数量就会增长到很大,所以如果month达到几十的话就会超过int范围,所以可以考虑用__int64代替int,另外到时候如果依然每次都递归的话运行速度也会变慢,可能要好几秒,好几分钟,甚至更长的时间才能算出结果,所以可以考虑用数组存每个递归函数算出的值,如:
littleR(int month)中else可写成
if (...)
{
...
}
else
{
if (a[month]!=0)
return month;
else
return a[month]=bigR(month-1)+little(month-1);
}
用这种方法可以适当提高运行速度。。。
温馨提示:内容为网友见解,仅供参考
第1个回答  2017-10-15

#include <stdio.h>

//假设不溢出

int fibonacci(int month)

{

int num,num1=1,num2=1;

int i;


if(month < 1) {

printf("error!\n");

return -1;

}

if((month == 1) || (month == 2)) {

return 1;

} else {

/* 迭代法,降低时间复杂度和空间复杂度。*/

for(i=2; i<month; i++) {

num = num1 + num2;

num1 = num2;

num2 = num;

}

}


return num;

}


int main(void)

{

int num = 0, ret = 0;

printf("请输入月数:\n");

scanf("%d", &num);

ret = fibonacci(num);

printf("兔子的对数:%d\n", ret);

return 0;

}


第2个回答  推荐于2018-02-27
递归实现
#include<stdio.h>
int Feibonacci(int n)
{
if(n==1||n==2)
return 1;
else
return Feibonacci(n-1)+Feibonacci(n-2);
}
void main()
{
printf("36个月的兔子总数为%d\n",Feibonacci(36));
}本回答被提问者和网友采纳
第3个回答  2011-05-13
//实际上就是Feibonacci系列。
#include"stdio.h"
int feibo(int n)
{
if(n==1||n==2) return 1;
else return feibo(n-1)+feibo(n-2);
}
void main()
{
printf("feibo(36)=%d\n",feibo(36));
}追问

请问..这个方法是用的递归的方法吗?

追答

//下面这个就是递归函数,feibo自己调用自己。
//楼主太跨张了!
int feibo(int n)
{
if(n==1||n==2) return 1;
else return feibo(n-1)+feibo(n-2);
}

第4个回答  2011-05-14
#include<stdio.h>
void main()
{
long int f1,f2;
int i;
f1=1;f2=1;
for(i=1;i<=20;i++)
{
printf("%12ld %12ld",f1,f2);
if(i%2==0)
printf("\n");
f1=f1+f2;
f2=f2+f1;
}
}

古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到...
printf("请输入月数:\\n");scanf("%d",&n);a[0]=a[1]=1;for(i=2;i<n;i++)a[i]=a[i-1]+a[i-2];printf("%d\\n",a[n-1]);} include<stdio.h> void main(){ long f1,f2;int i,n,m;f1=f2=1;printf("输入月数:\\n");scanf("%d",&n);for(i=3;i<=n;i++)...

c语言高手急救:有一对兔子,从出生第3个月起每个月都生一对兔子……
int f(int n){ if(n==1||n==2)return 1; else return f(n-1)+f(n-2);}void main(void){ int n; cout<<"输入n:"; cin>>n; cout<<f(n)<<"对"<<endl;}

c语言100道题中,兔子生兔子程序怎么理解
输入要计算的月数:1010个月的兔子总数为55递归看上去非常符合逻辑,但是这种递归效率是非常慢的,不信你计算20, 30, 40 个月的兔子数试试,明显比另外两种方法慢多了,具体分析请看:C语言用递归求斐波那契数,让你发现递归的缺陷和效率瓶颈【代码三】使用数组 include<stdio.h>void main(){ in...

...有一对兔子,从出生后第3个月起每个月都生一对
这道题目考察的是运用递归(数列)的思路去解决问题。假设到第24个月,示例代码如下:public class woo { public static void main(String args[]) { System.out.println(fib(24));} private static int fib(int n) { if (n == 1 || n == 2) { return 1;} else { return fib(n - ...

C语言问题
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月 后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21... 2.程序源代码: main() { long f1,f2; int i; f1=f2=1; for(i=1;i<=20;i++...

在C语言中,什么是迭代法?
分析:这是一个典型的递推问题。我们不妨假设第 1 个月时兔子的只数为 u 1 ,第 2 个月时兔子的只数为 u 2 ,第 3 个月时兔子的只数为 u 3 ,……根据题意,“这种兔子从出生的下一个月开始,每月新生一只兔子”,则有u 1 = 1 , u 2 = u 1 + u 1 × 1 = 2 , u 3 = u 2 + u 2 ...

VB中判断闰年和判断水仙花数的程序是什么?
【程序1】题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21...【程序2】题目:判断101-200之间有多少个素数,并输出所有素数。1....

C语言编程:兔子繁殖问题
思路不要乱。这个月的兔子只有两个来源,一个来源是上个月的老兔子,另一个来源是这个月刚出生的兔子,而这个月刚出生的兔子,就是两个月前的所有兔子,因为两个月前的所有兔子,无论两个月前就是老的,还是两个月前刚生的,到了这个月就全部具有生育能力,每只都可以下一对儿,所以可以得到一...

C语言的兔子问题
\/\/通过递归调用可以实现 \/\/希望我的回答对你有帮助,呵呵 include <stdio.h> int fun(int);int main(){ int n;scanf("%d",&n);for(int i=1;i<=n;i++){ printf("%-4d",fun(i));} printf("\\n");return 0;} int fun(int i){ if(i==1||i==2)return 1;else return fun...

c语言编程,求兔子问题。
{\/\/第n年x岁的兔子数是第n-1年x-1岁兔子的数量 \/\/ a[x] a[x-1]for(j=5;j>0;j--)a[j] = a[j-1];\/\/7岁的就会死掉,直接丢弃 \/\/到3岁就可以生一对,所以从3(数组从0开始,故这里是2)加到6 a[0] = a[2] + a[3] + a[4] + a[5];} return (a[0] ...

相似回答