鱼C论坛

 找回密码
 立即注册
查看: 1697|回复: 8

[已解决]递归算fabonaci

[复制链接]
发表于 2020-9-26 16:02:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我自己了一个用递归算fabonaci的程序,运行之后发现总是多算了一次递归循环,不知道哪里出了问题,求各位能够帮忙看一下,谢谢。
最佳答案
2020-9-26 21:51:58
gonorth 发表于 2020-9-26 18:56
谢谢您的回复,照您所述,那是不是应该为 a >=3, 呢?,感觉您这个算出来的话有f(0)的存在,并且值也是1 ...

在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔都不死,那么一年以后可以繁殖多少对兔子?我们不妨拿新出生的一对小兔子分析一下: 兔子出生那个月算0月的话,第一个月小兔子没有繁殖能力,所以还是一对; 两个月后,生下一对小兔民数共有两对; 三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对;  第四个月老兔子生下一对,小兔子也生下一对,所以是五对兔子。。。。。。依次类推可以列出下表:
经过月数:0  1  2  3  4  5  6    7    8    9    10  11    12
兔子对数:1  1  2  3  5  8  13  21  34  55  89  144  233
递归算fabonaci问题.png

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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");

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-26 16:13:16 | 显示全部楼层
还好之前收集了这个程序,方能抢个先手
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-26 16:21:58 | 显示全部楼层
乐乐学编程 发表于 2020-9-26 16:13
还好之前收集了这个程序,方能抢个先手

您好,谢谢您的回复,您这个算是标答了,但是我想知道的是我写的这个的问题出在哪里,也是初学,所以想知道问题所在,可否帮忙看一下?谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;
} 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-26 16:28:22 | 显示全部楼层
你的程序y要是不乘以12,从1到n会输出 1 1 1 2 3 5 8 13 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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));     // 输出统计循环次及兔子数
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢您的回复,照您所述,那是不是应该为 a >=3, 呢?,感觉您这个算出来的话有f(0)的存在,并且值也是1。麻烦您指正,谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-26 21:51:58 | 显示全部楼层    本楼为最佳答案   
gonorth 发表于 2020-9-26 18:56
谢谢您的回复,照您所述,那是不是应该为 a >=3, 呢?,感觉您这个算出来的话有f(0)的存在,并且值也是1 ...

在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔都不死,那么一年以后可以繁殖多少对兔子?我们不妨拿新出生的一对小兔子分析一下: 兔子出生那个月算0月的话,第一个月小兔子没有繁殖能力,所以还是一对; 两个月后,生下一对小兔民数共有两对; 三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对;  第四个月老兔子生下一对,小兔子也生下一对,所以是五对兔子。。。。。。依次类推可以列出下表:
经过月数:0  1  2  3  4  5  6    7    8    9    10  11    12
兔子对数:1  1  2  3  5  8  13  21  34  55  89  144  233
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 23:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表