【问题标题】:How can this recursive code can be understood?如何理解这个递归代码?
【发布时间】:2014-06-16 07:35:11
【问题描述】:
int j(int i) {
    if (i==0) return 2;
    return i*j(i-1);
}

调用 j(4) 得到 48。

感觉自己看懂了代码,但不知道48是怎么实现的。

我是这样理解的,

int j(4){

4 不等于 0,所以它不会返回 2

4*j(i-1) = 4*j(3)

然后我回到顶部并重复

3*j(2)
2*j(1)
1*j(0)

现在我返回 2。

这是我迷路的地方,我不太确定在这一步之后要做什么以及 j(4) 的答案是 48。

【问题讨论】:

  • 那么您期望 4 x 3 x 2 x 1 x 2 是什么?
  • 纸+铅笔+努力=理解
  • Stepping + through + with + a + debugger = 启蒙
  • @DavidWallace 谢谢你超越我... :)

标签: java recursion int return


【解决方案1】:

j(0) 显然返回 2,对吧?

所以j(1) 返回1*j(0),而j(0) 是2。所以j(1) 返回2*1,或2。

j(2) 返回 2*j(1)2*2 或 4。

j(3) 返回 3*j(2)3*4 或 12。

j(4) 返回 4*j(3)4*12 或 48。

【讨论】:

    【解决方案2】:

    所以这是在召唤

    返回 4 * 3 * 2 * 1 * 0(没有非 0 使用 2)

    结果 48

    【讨论】:

      【解决方案3】:

      评价可以这样理解

      j(4)
      4 * j(3)
      4 * (3 * j(2))
      4 * (3 * (2 * j(1)))
      4 * (3 * (2 * (1 * j(0))))   // When input to j is 0, returns 2
      4 * (3 * (2 * (1 * 2)))
      4 * (3 * (2 * 2))
      4 * (3 * 4)
      4 * 12
      48
      

      直到递归到达j(0),它会越来越深。但是当它到达它时,它开始展开递归。最重要的是,

      if (i==0) return 2;
      

      称为递归的基本条件。

      【讨论】:

      • @newCoder 不客气 :) 我们都很难理解这一点。但是,一旦你理解了它,你就会爱上它们:-)
      【解决方案4】:

      你可以通过它追踪:

      j(4) = 4 * j(3) = 4 * (3 * j(2)) = 4 * 3 * 2 * j(1) 
           = 4 * 3 * 2 * 1 * j(0) = 4 * 3 * 2 * 1 * 2 = 48
      

      【讨论】:

        猜你喜欢
        • 2018-03-28
        • 1970-01-01
        • 2016-08-07
        • 2021-12-24
        • 2018-05-31
        • 2020-07-31
        • 2013-08-22
        • 2016-04-12
        • 2020-10-09
        相关资源
        最近更新 更多