递归算fabonaci
我自己了一个用递归算fabonaci的程序,运行之后发现总是多算了一次递归循环,不知道哪里出了问题,求各位能够帮忙看一下,谢谢。 //求斐波那契数列前N项的和#include<stdio.h>
#include <math.h>
void main()
{
int i = 1,j = 1,k,n; // n 为需要计算的前几项之和
int f1 = 1 ;
int f2 = 1 ;
while(j<4)
{
j++;
while(1)
{
scanf("%d",&n);
if(n>0) break;
printf("项数不能为负数,请重新输入!\n");
}
while(1)
{
if(n>0) break;
scanf("%d",&n);
if(floor(n) != ceil(n))
printf("项数只能为整数,请重新输入!\n");
break;
}
break;
}
if (j==3)
{
printf("你输入错误超过三次,请想清楚了再试\n");
goto loop; // 输错三次,无条件退出程序
}
if(n % 2 != 0)
{
n = (n - 1) / 2;
k = 1;
}
else
{
n = n / 2;
k = 0;
}
for(;i < n;i++)
{
f1 = f1 + f2 ; // 计算出下一个数,并存放于 f1 中
f2 = f2 + f1 ; // 计算出下两个数,并存放于 f2 中
}
if(k == 1)
{
f1 = f1 + f2 ;
printf("%d\n",f1);
}
else
printf("%d\n",f2);
loop :printf("\n");
} 还好之前收集了这个程序,方能抢个先手 乐乐学编程 发表于 2020-9-26 16:13
还好之前收集了这个程序,方能抢个先手
您好,谢谢您的回复,您这个算是标答了,但是我想知道的是我写的这个的问题出在哪里,也是初学,所以想知道问题所在,可否帮忙看一下?谢谢。 不应该是少算一次吗?
#include <stdio.h>
int fab(int a);
int fab(int a){
int sum;
if(a>=3)
sum = fab(a-1) + fab(a-2);
else
sum = 1;
return sum;
}
int main(){
int y;
scanf("%d",&y);
printf("%d",fab(y));
return 0;
} 你的程序y要是不乘以12,从1到n会输出 1 1 1 2 3 5 8 13 ... 你的计算有误,兔子在第三个月开始就生一对小兔子,所以,应该将 if(a > 3),改为 if(a >= 2)。另外,为了帮助你理解,我设置了一个全局变量,来统计循环了多少次
# include <stdio.h>
int f(int a);
int i = 0; // 定义全局变量
int f(int a)
{
int sum = 0;;
if (a >= 2)
{
sum = f(a - 1) + f(a - 2);
i++; // 统计循环次数
}
else
{
sum = 1;
}
return sum;
}
int main()
{
int y;
printf ("input the year: ");
scanf("%d",&y);
y = y * 12;
printf("%d\t%d\n",i,f(y)); // 输出统计循环次及兔子数
} 风过无痕1989 发表于 2020-9-26 18:09
你的计算有误,兔子在第三个月开始就生一对小兔子,所以,应该将 if(a > 3),改为 if(a >= 2)。另外,为了 ...
谢谢您的回复,照您所述,那是不是应该为 a >=3, 呢?,感觉您这个算出来的话有f(0)的存在,并且值也是1。麻烦您指正,谢谢。 gonorth 发表于 2020-9-26 18:56
谢谢您的回复,照您所述,那是不是应该为 a >=3, 呢?,感觉您这个算出来的话有f(0)的存在,并且值也是1 ...
在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔都不死,那么一年以后可以繁殖多少对兔子?我们不妨拿新出生的一对小兔子分析一下: 兔子出生那个月算0月的话,第一个月小兔子没有繁殖能力,所以还是一对; 两个月后,生下一对小兔民数共有两对; 三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对;第四个月老兔子生下一对,小兔子也生下一对,所以是五对兔子。。。。。。依次类推可以列出下表:
经过月数:0123456 7 8 9 1011 12
兔子对数:1123581321345589144233
页:
[1]