【问题标题】:Fibonacci Series in C - The series of numbers up to a given number [closed]C中的斐波那契数列-直到给定数字的数字系列[关闭]
【发布时间】:2013-04-24 13:34:48
【问题描述】:

有人可以就我下面给出的代码提供反馈吗?我已经用其他语言多次完成了斐波那契数列,但由于某种奇怪的原因,当我用 C 编写代码时,它不会打印出正确的数列。我似乎无法弄清楚我做错了什么。

#include <stdio.h>

int fibonacci (int n)
{
    (int i = 0; i < n; i++)
{
if (i == 0 || i == 1)
{
     printf("%d,", i);
else
{
     printf("%d,", ((i-1) + (i-2)));
}
}
}


int main () 
{
   int (*fnctPtr)(int number);
   fnctPtr = &fibonacci;
   fnctPtr(9);
   return 0;
}

【问题讨论】:

  • "for" 语句丢失?
  • 你程序里的逻辑全错了,我觉得编译不出来。修复程序以使其编译,查看输出,并查看是否可以通过逐步执行您编写的函数来推断输出错误的原因。请注意,斐波那契的传统定义使用递归关系。
  • 非常感谢。我对代码做了更多的工作,并且阅读了更多关于 C 编码的内容。我想我现在已经掌握了要点。

标签: c fibonacci


【解决方案1】:

您正在尝试计算和打印前 n 个斐波那契数。 第一个斐波那契数是 0,然后是 1,之后的每个数字都是前两个斐波那契数之和。

例如:0, 1, 1, 2, 3, 5, 8, 13, 21, ... 你懂的。

您的代码的问题在于您没有走斐波那契路径。

在您的代码中:printf("%d,", ((i-1) + (i-2))); 您实际上是在将索引添加到数组中,而没有构建数组或链表。

在 C 中无需递归或数组的一种简单有效的方法是:

// Prime the first two fibbonaci numbers
int a = 0;  // prior fibbonnaci number
int b = 1;  // current fibbonacci number
// Special case, print up to first 2 fibbonacci numbers
if (n >= 1) printf("%d,", a);  // first fibbonacci number
if (n >= 2) printf("%d,", b);  // second fibbonacci number
// now for the rest of fibbonacci numbers
for (int i = 2; i < n; i++) {
    int next = a + b;
    printf("%d,", next);
    // rotate the numbers
    a = b;
    b = next;
 }

【讨论】:

    【解决方案2】:

    恐怕你需要真正清理你的代码。以下在 C 中绝对错误。

    (int i = 0; i < n; i++)
    

    我确定您打算在这里使用for 循环。但是谁知道您的想法?然后你在ifFibonacci() 块中包含了一个单独的else。你的程序中有很多错误,所以让我给你一个程序,它可以根据用户系列中的数字数量创建斐波那契系列想要(从键盘输入的选项)。请试着理解这个程序。这很容易,因为斐波那契数列背后的逻辑本身很简单。只是很明显你对 C 语言很陌生。

    #include<stdio.h>
    #include<stdlib.h>
    
    int main() 
    {
        int i,l,x=1,y=1,z;
        printf("Enter how many Fibonacci numbers you want\n");
        scanf("%d",&l);
    
        printf("The Fibonacci series of %d numbers is\n",l);
    
       if(l==1)
       {
       printf("1");
       exit(0);
       }
    
       if(l==2)
       {printf("1+1");
       exit(0);
       }    
    
      printf("1+1+");
    
      for(i=3;i<=l;i++)
       {
       z=x+y;
       printf("%d",z);    
       x=y;
       y=z;
       if((i+1)<=l) printf("+");
       }    
    }
    

    既然你说你已经用其他语言实现了这个系列,你不会有问题以0,1,1,2,3,5.....开始这个系列,我的程序是1,1,2,3,5...,因为xy都初始化为1而不是将x 初始化为0。调整代码来实现它。

    【讨论】:

      【解决方案3】:
      #include <stdio.h>
      #include <stdlib.h>
      
      void fibonacci (int n){
          int *k = malloc(n*sizeof(int));
          k[0]=0;k[1]=1;
          for(int i = 0; i < n; i++){
              if (i == 0 || i == 1)
                  printf("%d,", k[i]);
              else
                  printf("%d,", k[i] = k[i-1] + k[i-2]);
          }
          free(k);
      }
      
      int main () {
          void (*fnctPtr)(int number);
          fnctPtr = fibonacci;
          fnctPtr(9);
          return 0;
      }
      

      【讨论】:

        【解决方案4】:

        你有这个(int i = 0; i &lt; n; i++),你应该有for (int i = 0; i &lt; n; i++)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-06-28
          • 2020-01-18
          • 1970-01-01
          • 1970-01-01
          • 2014-11-09
          • 1970-01-01
          • 2015-06-05
          相关资源
          最近更新 更多