试图理解这个简单的递归代码

时间:2012-09-26 23:51:24

标签: recursion

请帮我理解这个简单的递归。我对编程非常陌生,所以我想知道这是如何一步步发生的。

我正在尝试学习递归,但我仍然坚持添加“+”

function foo($bar) {
  if ($bar == 1) return 1;
  elseif ($bar == 0) return 0;
  else return foo($bar - 1) + foo($bar - 2);
}

3 个答案:

答案 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()打印出包含调用深度参数的参数可能是有益的。