我们被要求编写一个程序来生成斐波那契系列作为我们的功课。 所以我写了一个程序,生成了第一个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-我是一个初学者。只用了三个星期的语言,我们正在学习循环。
答案 0 :(得分:4)
陈述的顺序很重要。
b = c;
a = b;
运行此选项时,b
和a
都将等于c
的原始值,并且b
的旧值已丢失。这可能不是你想要的。
a = b;
b = c;
运行此选项时,a
将等于b
的旧值,b
将等于c
的原始值。
答案 1 :(得分:2)
在Fibonacci系列中,生成一个新数字作为前两个数字的总和。
让我们说前两个数字是A
和B
,新生成的数字是C
。现在,对于下一次迭代,您需要忘记A
和B
&amp; C
是您以前的新号码。
要使B
和C
成为新的A
和B
,您需要这样做:
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;
执行此操作后,a
和b
的值均为c
。
c = a + b ;
printf("%d \t", c) ;
a=b;
b=c;
如果您重新排列语句,a
会获得b
的旧值,b
会获得c
的新值。
答案 3 :(得分:1)
行按顺序执行,因此在第一个示例中,b
在c
成为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
?
为什么不反过来或同时发生一切?
什么是细分错误?
简单的谷歌搜索会给你很多解释。这意味着你已经访问了内存,这不是你的内存。