如何跟踪调用自身的函数流?

时间:2012-03-06 03:50:56

标签: c++ math recursion

嗯,这是我从这次练习考试中得到的另一个问题,即我不知道该怎么做。

int fun5 (int c, int d) {
    if (c <= d) {
        return c;
    } else {
        return fun5(c-d, d) * c;
    }
}

当你运行值为fun5(9,3)的代码时,你应该得到162,但我不知道如何到达那里。显然第一个if语句是假的,所以你去了else,但是你必须回到带有这些新值的fun5,但是if语句再次失败,所以你再次去了else,但你刚来自那里。我现在只是一个非常困惑的人。

2 个答案:

答案 0 :(得分:4)

让我们追溯一下,看看会发生什么!

调用fun5(9, 3)将返回

的值
  fun5(9, 3)
= fun5(9 - 3, 3) * 3
= fun5(6, 3) * 9

好吧,我们有那个

  fun5(6, 3)
= fun5(3, 3) * 6

然后

  fun5(3, 3) = 3

所以这意味着

  fun5(6, 3)
= fun5(3, 3) * 6
= 3 * 6
= 18

所以这意味着

  fun5(9, 3)
= fun5(6, 3) * 9
= 18 * 9
= 162

您的答案来自哪里。

希望这有帮助!

答案 1 :(得分:2)

这是递归

第一次c = 9而d = 3所以你做了else语句:(下面用数字代替)

return fun5(9-3, 3) * 9;

然后你用c = 6和d = 3做下一步,所以你再做一次

return fun5(6-3, 3) * 6;

然后你用c = 3和d = 3做下一个,所以你做了if

return 3;

跟进你得到的堆栈

return 3;
return 3 * 6;
return 18 * 9;

最终回报是18 * 9或162。

相关问题