鱼C论坛

 找回密码
 立即注册
查看: 2103|回复: 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

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-9-26 16:11:25 | 显示全部楼层
  1. //求斐波那契数列前N项的和

  2. #include<stdio.h>
  3. #include <math.h>
  4. void main()
  5. {
  6.         int i = 1,j = 1,k,n;                           // n 为需要计算的前几项之和
  7.         int f1 = 1 ;
  8.         int f2 = 1 ;
  9.     while(j<4)
  10.         {
  11.                 j++;
  12.                 while(1)
  13.                 {
  14.                         scanf("%d",&n);
  15.                         if(n>0) break;
  16.                         printf("项数不能为负数,请重新输入!\n");
  17.                 }
  18.                 while(1)
  19.                 {
  20.                         if(n>0) break;
  21.                         scanf("%d",&n);
  22.                         if(floor(n) != ceil(n))
  23.                                 printf("项数只能为整数,请重新输入!\n");
  24.                         break;
  25.                 }
  26.                 break;
  27.         }
  28.     if (j==3)
  29.         {
  30.         printf("你输入错误超过三次,请想清楚了再试\n");
  31.         goto loop;                               // 输错三次,无条件退出程序
  32.         }
  33.         if(n % 2 != 0)
  34.         {
  35.                 n = (n - 1) / 2;
  36.                 k = 1;
  37.         }       
  38.         else
  39.            {
  40.                 n = n / 2;
  41.                 k = 0;
  42.            }
  43.         for(;i < n;i++)
  44.         {
  45.                 f1 = f1 + f2 ;                            // 计算出下一个数,并存放于 f1 中
  46.                 f2 = f2 + f1 ;                            // 计算出下两个数,并存放于 f2 中
  47.         }
  48.         if(k == 1)
  49.         {
  50.                 f1 = f1 + f2 ;
  51.                 printf("%d\n",f1);
  52.         }
  53.         else
  54.                 printf("%d\n",f2);
  55. loop :  printf("\n");

  56. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-26 16:13:16 | 显示全部楼层
还好之前收集了这个程序,方能抢个先手
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

发表于 2020-9-26 16:26:48 | 显示全部楼层
不应该是少算一次吗?
  1. #include <stdio.h>

  2. int fab(int a);
  3. int fab(int a){
  4.         int sum;
  5.         if(a>=3)
  6.                 sum = fab(a-1) + fab(a-2);
  7.         else
  8.                 sum = 1;
  9.         return sum;
  10. }


  11. int main(){
  12.         int y;
  13.         scanf("%d",&y);
  14.         printf("%d",fab(y));
  15.         return 0;
  16. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-26 16:28:22 | 显示全部楼层
你的程序y要是不乘以12,从1到n会输出 1 1 1 2 3 5 8 13 ...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-26 18:09:51 | 显示全部楼层
你的计算有误,兔子在第三个月开始就生一对小兔子,所以,应该将 if(a > 3),改为 if(a >= 2)。另外,为了帮助你理解,我设置了一个全局变量,来统计循环了多少次

  1. # include <stdio.h>
  2. int f(int a);
  3. int i = 0;                         // 定义全局变量
  4. int f(int a)
  5. {
  6.     int sum = 0;;
  7.         if (a >= 2)
  8.         {
  9.         sum = f(a - 1) + f(a - 2);
  10.                 i++;                 // 统计循环次数
  11.         }
  12.     else
  13.         {
  14.                 sum = 1;
  15.         }
  16.     return sum;
  17. }

  18. int main()
  19. {
  20.     int y;
  21.     printf ("input the year: ");
  22.     scanf("%d",&y);
  23.     y = y * 12;
  24.     printf("%d\t%d\n",i,f(y));     // 输出统计循环次及兔子数
  25. }
复制代码
小甲鱼最新课程 -> https://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。麻烦您指正,谢谢。
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-15 09:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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