请帮我理解这个简单的递归。我对编程非常陌生,所以我想知道这是如何一步步发生的。
我正在尝试学习递归,但我仍然坚持添加“+”
function foo($bar) {
if ($bar == 1) return 1;
elseif ($bar == 0) return 0;
else return foo($bar - 1) + foo($bar - 2);
}
答案 0 :(得分:1)
当试图理解递归时,我发现为特定参数写下每个案例有很多帮助,然后从那里建立你的理解。
让我们以foo(3)
foo(3) - >我们没有击中任何一个基本情况,所以我们的函数现在想要返回
foo(2) + foo(1)
首先我们需要得到foo(2)
foo(2) - >再次没有基本情况,所以我们返回
foo(1) + foo(0)
foo(1)= 1和foo(0)= 0(这些是我们的基本情况)所以我们看到了
foo(2) = 1 + 0
现在我们看看foo(3)已解决
foo(3) - > (1 + 0)+ foo(1)
foo(1)= 1,所以我们终于可以看到了
foo(3) - > (1 + 0)+ 1 = 2
你必须记住,递归基本上构建了一个函数调用的“树” - 它将尽可能远离树,然后上升到一个级别,看看还有什么需要继续。我不确定这有多清楚,但希望它有所帮助。
答案 1 :(得分:1)
它真的很简单(一旦你绕过它)。在最后一行中,您将两次调用函数foo并将它们的返回值相加。
这是一个示例跟踪
call 1:
foo(3)
return foo(2) + foo(1)
call 2:
foo(2)
return foo(1) + foo(0)
call 3:
foo(1)
return 1
unrolls to call 2:
return 1 + foo(0)
call 4:
foo(0)
return 0
unrolls to call 2 again:
return 1 + 0
unrolls to call 1:
return 1 + foo(1)
call 5:
foo(1)
return 1
unrolls to call 1 again:
return 1 + 1
答案 2 :(得分:0)
foo()的第一次调用最终会调用另外两次 foo()的调用。这两个中的每一个依次调用它们中的两个,依此类推。
首次迭代
FOO()
第二次迭代
foo()foo()
第三次迭代
foo()foo()foo()foo()
等
因此,如果foo()没有达到其中一个终止条件,它总是自己调用两次。
添加一个表示调用深度的变量并让foo()打印出包含调用深度参数的参数可能是有益的。