【问题标题】:fibonacci series gone wrong?斐波那契数列出错了?
【发布时间】:2012-11-10 11:29:36
【问题描述】:

我们被要求编写一个程序来生成斐波那契数列作为我们的作业。 所以我写了一个程序来生成前 n 个斐波那契数。这是我的第一个代码,可以正常工作

# include <stdio.h>
void main()
{
    int a = -1, b = 1, c = 0, i, n, sum = 0 ;
    printf("Enter the limit : ") ;
    scanf("%d", &n) ;
    printf("\nThefibonacci series is : \n\n") ;

    for(i = 1 ; i <= n ; i++)
    {
        c = a + b ;
        printf("%d \t", c) ;
        b=c;
        a=b;
    }
}

所以我尝试了各种组合,我发现如果我将第 12 行和第 13 行互换,我的代码会运行良好。即

# include <stdio.h>
void main()
{
    int a = -1, b = 1, c = 0, i, n, sum = 0 ;
    printf("Enter the limit : ") ;
    scanf("%d", &n) ;
    printf("\nThefibonacci series is : \n\n") ;
    for(i = 1 ; i <= n ; i++)
    {
        c = a + b ;
        printf("%d \t", c) ;
        a=b;
        b=c;
    }
}

逻辑是一样的。 为什么第一个代码给我错误的输出?

什么是分段错误?(我的编译器经常告诉我我的代码中有分段错误)

P.S-我是个初学者。刚刚学习 c 语言三周,我们正在学习循环。

【问题讨论】:

  • 在您的第一个替代方案中,您将c 传递给ab
  • @SameerSai 这只是讽刺:p 编程代码是逐行执行的。交换行 = 新算法
  • @Sameer Sai:侮辱你?不。你自己做的很好。
  • @Mitch 你可以把最后一条评论写得更好一些……
  • @MitchWheat:你自己从来都不是初学者吗? OP可能有一个糟糕的教练和英语问题,我们的反应是把他赶走?确实,“注定要失败”。

标签: c


【解决方案1】:

语句的顺序很重要。

b = c;
a = b;

运行时,ba 都将等于 c 的原始值,而 b 的旧值已丢失。这可能不是您想要的。

a = b;
b = c;

运行时,a 将等于 b 的旧值,b 将等于 c 的原始值。

【讨论】:

    【解决方案2】:

    在斐波那契数列中,会生成一个新数字作为前两个数字的总和。

    假设前两个数字是AB,新生成的数字是C。现在,对于下一次迭代,您需要忘记 ABC 是您以前的新号码。

    要使BC 成为新的AB,您需要这样做:

    A = B   // B becomes the new A
    B = C   // C becomes the new B
    

    你正在做的是:

    B = C   // C becomes the new B, but you've not saved the old value of B!!!
    A = B   // Old value of B gone..B is now C, which is assigned to A
    

    【讨论】:

      【解决方案3】:

      行是按顺序执行的,因此在第一个示例中,a 变为 b 之前的第一个示例 b 变为 c,实际上您将 c 分配给 ab 创建某种类型指数级数(但为零)而不是斐波那契数列。

      分段错误意味着您的程序正在访问不允许访问内存的某个地方的内存,通常是因为您取消引用无效指针或访问超出范围的数组。

      【讨论】:

      • 哦,我明白了。!这样一个愚蠢的错误。虽然谢谢你的解释很好
      【解决方案4】:

      单独来看这个:

          c = a + b ;
          printf("%d \t", c) ;
          b=c;
          a=b;
      

      执行此操作后ab 的值将是c

          c = a + b ;
          printf("%d \t", c) ;
          a=b;
          b=c;
      

      如果重新排列语句,a 将获得 b 的旧值,b 将获得 c 的新值。

      【讨论】:

        【解决方案5】:

        这是同样的逻辑。为什么第一个代码给我错误的输出?

        你有没有想过,为什么

        printf("Enter the limit : ") ;
        scanf("%d", &n) ;
        printf("\nThe fibonacci series is : \n\n") ;
        

        首先输出Enter the limit,然后等待您输入一个数字,然后输出The fibonacci series is——按特定顺序?

        为什么不反过来或同时做所有事情?


        什么是分段错误?

        一个简单的谷歌搜索会给你大量的解释。这意味着您访问了内存,这不是您可以访问的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-06-05
          • 2021-11-30
          • 2015-01-04
          相关资源
          最近更新 更多