我一直试图通过递归运行斐波纳契数列的代码并用于传递fib(x,y,i--),这导致无限递归,而相同的代码通过使用fib(x,y, I-1)。 这有什么重要原因吗?
答案 0 :(得分:1)
`$(document).ready(function(){
$('.sac-services-slider').slick({
infinite: true,
nextArrow: '.sac-services-slider-btn',
autoplay: true,
responsive: [{
breakpoint: 1200,
settings: {
slidesToShow: 1,
infinite: true
}
}, {
breakpoint: 992,
settings: {
slidesToShow: 1,
dots: true
}
}, {
breakpoint: 768,
settings: "unslick"
}]
});
});`
将i--
传递给函数,然后减少调用者范围内的i
值。
i
将i-1
传递给该函数,并且不会更改调用者范围中的i-1
值。
所以是的,他们完全不同。如果i
调用自身,则会反复传递相同的数字,从而导致无限递归
答案 1 :(得分:0)
首先考虑使用i-1
您的结果将是i
减去1的值,但变量i
将保留其初始值(没有赋值)。相反,使用递增或递减运算符修改变量(在这种情况下有赋值.I.e。i++
等同于i=i+1
)。
说,运算符--
,递减和++
递增,有两种形式:前缀(即++i
)和后缀(即i++
),增量或减量的操作分别在使用表达式值之前或之后根据您放置的位置启动。
虽然表达式i-1
总是在使用结果之前执行操作(它表现为带前缀的递减运算符),但使用递增或递减运算符作为前缀,操作,递增或递减,先执行结果,然后执行结果用来。另一方面,如果运算符遵循表达式postfix,则在应用运算符之前将使用或传递该值。
在您的情况下,您正在使用 postdecrement ,例如:
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
...
}