斐波那契系列出了问题?

时间:2012-11-10 11:29:37

标签: c

我们被要求编写一个程序来生成斐波那契系列作为我们的功课。 所以我写了一个程序,生成了第一个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-我是一个初学者。只用了三个星期的语言,我们正在学习循环。

5 个答案:

答案 0 :(得分:4)

陈述的顺序很重要。

b = c;
a = b;

运行此选项时,ba都将等于c的原始值,并且b的旧值已丢失。这可能不是你想要的。

a = b;
b = c;

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

答案 1 :(得分:2)

在Fibonacci系列中,生成一个新数字作为前两个数字的总和。

让我们说前两个数字是AB,新生成的数字是C。现在,对于下一次迭代,您需要忘记AB&amp; C是您以前的新号码。

要使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

答案 2 :(得分:1)

孤立地看待这个:

    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的新值。

答案 3 :(得分:1)

行按顺序执行,因此在第一个示例中,bc成为a之前变为b,实际上您正在为c分配a b和{{1}}创建某种指数级数(但为零)而不是斐波纳契数列。

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

答案 4 :(得分:1)

  

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

你有没有想过,为什么

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

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

为什么不反过来或同时发生一切?


  

什么是细分错误?

简单的谷歌搜索会给你很多解释。这意味着你已经访问了内存,这不是你的内存。