gonorth 发表于 2020-9-26 16:02:26

递归算fabonaci

我自己了一个用递归算fabonaci的程序,运行之后发现总是多算了一次递归循环,不知道哪里出了问题,求各位能够帮忙看一下,谢谢。

乐乐学编程 发表于 2020-9-26 16:11:25

//求斐波那契数列前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:16

还好之前收集了这个程序,方能抢个先手

gonorth 发表于 2020-9-26 16:21:58

乐乐学编程 发表于 2020-9-26 16:13
还好之前收集了这个程序,方能抢个先手

您好,谢谢您的回复,您这个算是标答了,但是我想知道的是我写的这个的问题出在哪里,也是初学,所以想知道问题所在,可否帮忙看一下?谢谢。

baige 发表于 2020-9-26 16:26:48

不应该是少算一次吗?
#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;
}

baige 发表于 2020-9-26 16:28:22

你的程序y要是不乘以12,从1到n会输出 1 1 1 2 3 5 8 13 ...

风过无痕1989 发表于 2020-9-26 18:09:51

你的计算有误,兔子在第三个月开始就生一对小兔子,所以,应该将 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));   // 输出统计循环次及兔子数
}

gonorth 发表于 2020-9-26 18:56:00

风过无痕1989 发表于 2020-9-26 18:09
你的计算有误,兔子在第三个月开始就生一对小兔子,所以,应该将 if(a > 3),改为 if(a >= 2)。另外,为了 ...

谢谢您的回复,照您所述,那是不是应该为 a >=3, 呢?,感觉您这个算出来的话有f(0)的存在,并且值也是1。麻烦您指正,谢谢。

风过无痕1989 发表于 2020-9-26 21:51:58

gonorth 发表于 2020-9-26 18:56
谢谢您的回复,照您所述,那是不是应该为 a >=3, 呢?,感觉您这个算出来的话有f(0)的存在,并且值也是1 ...

在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔都不死,那么一年以后可以繁殖多少对兔子?我们不妨拿新出生的一对小兔子分析一下: 兔子出生那个月算0月的话,第一个月小兔子没有繁殖能力,所以还是一对; 两个月后,生下一对小兔民数共有两对; 三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对;第四个月老兔子生下一对,小兔子也生下一对,所以是五对兔子。。。。。。依次类推可以列出下表:
经过月数:0123456    7    8    9    1011    12
兔子对数:1123581321345589144233
页: [1]
查看完整版本: 递归算fabonaci