【问题标题】:First real program in C: Fibonacci sequenceC语言中的第一个真正的程序:斐波那契数列
【发布时间】:2023-03-12 15:58:01
【问题描述】:

我正在尝试编写斐波那契数列的前 10 个项。我觉得我在正确的路线上,但我似乎无法完全掌握实际的代码(用 C 语言)。

float fib = 0;
const float minn = 1;
const float maxn  = 20;
float n = minn;
while (n <= maxn);{
n = n + 1;
printf (" %4,2f", fib);
fib = (n - 1) + (n - 2);
}

【问题讨论】:

  • 本教程在学习如何为斐波那契数列编程时可能有用:geeksforgeeks.org/program-for-nth-fibonacci-number
  • fib(n) != n-1 + n-2 => 检查您的公式...(否则您可以轻松确定对于 n =10,fib 是 17)
  • 您添加 前两个元素(从 0 和 1 开始)以获得新数字。所以你需要存储前两个数字(你当前的逻辑没有它)。想想怎么做。你应该尽快从while (n &lt;= maxn);{ 中删除; ;-)

标签: c fibonacci


【解决方案1】:

对于斐波那契数列,值 f(n) = f(n - 1) + f(n = 2)。前三个值定义为 0、1、1。

斐波那契数列是整数值序列(数学整数,不一定是 C 语言值)。考虑使用 int 或 long 作为斐波那契值。 float 毫无价值,它只会增加不必要的开销。

在计算斐波那契数列时,您必须存储前 2 个值以获得下一个值。

您想要 10 个斐波那契值。您已经知道前三个,所以打印它们,然后计算接下来的七个值。

7 个值意味着一个循环迭代 7 次。它与返回的斐波那契值的最大值无关,与您要打印多少个值无关。

做这样的事情:

printf("0, 1, 1");

int currentValue;
int valueN1 = 1;
int valueN2 = 1;

for (int counter = 1; counter <= 7; ++counter)
{
    currentValue = valueN1 + valueN2;
    printf(", %d", currentValue);

    valueN2 = valueN1;
    valueN1 = currentValue;
}

【讨论】:

    【解决方案2】:

    您只需运行循环 10 次,即可找到斐波那契数列的前 10 个项。

    在你的代码中,while循环不会让你走得更远,因为循环末尾有分号

    //declare fib value as long int or unsigned int  
    // because the value of any fib  term  is   not at all 
    long int fib;
    int n=1; 
    while (n <= 10)
    {
    printf (" %d", fib);
    fib = fib_term(n); 
    n = n + 1;
    }
    

    implement fib_term(int n); by seeing this snippet

    【讨论】:

    • interchange 这两行printf (" %d", fib);fib = fib_term(n); 因为这个先打印然后调用函数来避免这个就先调用再打印。 fib = fib_term(n); printf (" %d", fib);
    【解决方案3】:

    首先,我建议将您的数据类型从浮点数更改为整数或其他数据类型。浮点数不是精确的数字,如果您使用 while (n = maxn) 而不是 while (n

    其次,您似乎并不真正了解斐波那契数列是什么。看看维基百科文章http://en.wikipedia.org/wiki/Fibonacci_number

    fibinocci 数不是 (n - 1) + (n - 2) 像你一样。它是序列中前两个数字的总和。您需要重新构建循环以保存最后两个值并根据这些值计算下一个值。

    【讨论】:

      【解决方案4】:

      有(至少)两种方法可以在 C 中实现斐波那契算法:

      迭代:

      int fib(int n){   
          if (n == 0)
             return 0; 
          int a = 1   
          int b = 1;   
          for (int i = 3; i <= n; i++) {     
              int c = a + b;     
              a = b;     
              b = c;   
          }   
          return b; 
      }
      

      递归:

      unsigned int fibonacci_recursive(unsigned int n)
      {
      if (n == 0) 
      {
          return 0;
      } 
      if (n == 1) {
             return 1;
      }
      return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2);
      }
      
      void main(){
          unsigned int i = fibonacci_recursive(10);
      }
      

      【讨论】:

      • 如果fibonacci_recursive()n &lt; 0 调用,可能会得到 Stack Overflow - 一个网站的好名字。
      【解决方案5】:

      建议

      1. 在处理整数问题时,在 FP 类型之前考虑整数类型。

      2. 在您的while (n &lt;= maxn);{ 中省略;

      3. 使用浮点格式的. %4.2f 而不是%4,2f

      4. 斐波那契是前两项之和,而不仅仅是fib = (n - 1) + (n - 2)

      5. 考虑unsigned 解决方案:

      C 代码:

      void Fibonacci_Sequence(unsigned n) {
        const unsigned minn = 1;
        const unsigned maxn = 20;
        unsigned F[3];
        F[0] = 0;
        F[1] = 1;
        unsigned i = 0;
        for (i = 0; i <= maxn; i++) {
          if (i >= minn) printf(" %u,", F[0]);
          F[2] = F[1] + F[0];
          F[0] = F[1]; 
          F[1] = F[2]; 
        }
      }  
      

      【讨论】:

        【解决方案6】:

        这使用 n/2 次迭代

        #include<stdio.h>
        main()
        {
                         int i,n,a=0,b=1,odd;
                         scanf("%d",&n);
                         odd=n%2;
                         for(i=1;i<=n/2;i++)
                         {
                                          printf("%d %d ",a,b);
                                          a=a+b;
                                          b=a+b;
                         }
                         if(odd)
                         printf("%d",a);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-25
          • 2023-02-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-20
          相关资源
          最近更新 更多