2017-02-04 105 views
-1

我一直试图通过递归运行fibonacci序列的代码,并用于传递fib(x,y,i--),这导致无限递归,而相同的代码通过使用fib(x,y,i -1)。 这有什么重要的原因吗?C中i--和i-1有什么区别?

+3

是的,你看看我在做什么吗?你应该阅读增量和减量操作符。 – miradulo

+1

[Increment and Decrement Operators]的可能重复(http://stackoverflow.com/questions/3891230/increment-and-decrement-operators) – Faegy

+0

Aha,** fibonacci **。曾见过电视连续剧“越狱”?你会知道我在说什么... –

回答

1

i--i传递给函数然后在调用者范围内递减i值。

i-1i-1传递给函数并且不会在调用者范围中更改i值。

所以是的,他们完全不同。如果fib电话本身,相同数量的传递一遍又一遍,造成无穷递归

0

首先考虑使用i-1您的结果将是i减去1的值,但是变量i将保留其初始值(没有任务)。相反地​​,使用增量或减量运算符修改变量(在这种情况下有赋值,即,i++相当于i=i+1)。

说,在运营商--,递减和++,递增,有两种形式:前缀(即++i)和后缀(即i++),递增或递减的操作之前或使用后分别致动表达式的值取决于你把它放在哪里。

尽管表达式i-1在使用结果之前总是执行操作(它表现为前缀递减运算符),但使用递增或递减运算符作为前缀,首先执行操作,即递增或递减,然后使用结果。另一方面,如果操作员在应用操作员之前遵循表达式postfix,则该值将被使用或传递。

在你的情况,你正在使用后减量在类似:

void fib(int x, int y, int i) 
{ 
    ... 
    if (i = 0) 
     return; 
    fib(x, y, i--); 
    ... 
} 

int main(void) 
{ 
    ... 
    fib(10, 20, 30); 
    ... 
} 

每次通话时间fib你传递的i初始值,然后在本地减小它的价值。它在递归调用中永远不会变为0,并且您的循环永远不会结束。

如果使用预递减,前缀操作者的表达(在这种情况下,变量i),行为变化,减量之前执行传递的价值,你的程序将工作(的行为相同的i-1):

void fib(int x, int y, int i) 
{ 
    ... 
    if (i = 0) 
     return; 
    fib(x, y, --i); //Note the prefix 
    ... 
}