【问题标题】:Understanding double recursion with print statement使用 print 语句理解双重递归
【发布时间】:2017-04-13 12:30:28
【问题描述】:

当递归只被调用一次时,我理解递归,当有两个递归时,我有点理解递归,因为一个递归必须先完成,或者在第二个开始之前完成。

我正在尝试理解河内塔,但我真正不明白的是当有两个带有打印语句的递归时读取代码行的顺序。

有人可以简单地分解订单吗?我创建了这个简单的示例(其中 test(3); )

为什么打印语句会运行?,它不是立即在自己身上调用吗?

public static void test(int n){

    if(n>0){
        test(n-2);    
        test(n-1);
        System.out.println("print " + n); 
    }
}

【问题讨论】:

  • "我真的不明白代码行的读取顺序。有人可以简单地分解顺序吗?" 您可以使用调试器查看如何执行时流程继续。
  • 打印语句只在所有中间方法调用都返回后运行,所以中间方法调用会在当前调用之前打印并返回。
  • 我不确定如何使用调试器来显示打印语句。通过正常步骤运行它只会显示它读取的行。 @berger,所以每次方法调用自己时,它都会执行 print 语句,对吗?
  • @DavidB : 是的,在当前方法调用中对方法的新调用将首先打印。

标签: java recursion


【解决方案1】:

我试图通过图表来详细说明它。看一看! 纬度n = 3;

【讨论】:

    【解决方案2】:

    您的代码不是 TOH 的精确实现。

    这是你的代码语句的递归树和执行顺序(看到它相信它):

    设 n = 4

                     4
    
           /                  \
          2                    3
      /      \            /         \
     0        1           1          2
           /     \      /   \     /     \
          -1      0    -1    0   0       1
                                       /   \
                                      -1    0
    
    test(4)
    test(2)
    test(0)
    test(1)
    test(-1)
    test(0)
    print(1)
    print(2)
    test(3)
    test(1)
    test(-1)
    test(0)
    print(1)
    test(2)
    test(0)
    test(1)
    test(-1)
    test(0)
    print(1)
    print(2)
    print(3)
    print(4)
    

    可以通过对树进行前序遍历来跟踪函数调用序列。打印语句将针对 node-value 大于 0 的节点执行,并且在该节点的两个子节点都返回之后。

    【讨论】:

    • 3 个而不是 1 个。
    • 编辑:所以它打印的顺序是,它走到每个分支的末尾,然后回到树上?例如左分支 = 1,2。右左分支 = 1。右右分支 = 1234?
    • 只看这棵树并对其进行前序遍历。打印语句是函数调用之后循环内的第三个语句。因此,它在两个函数调用将控制权返回给当前函数后执行。
    • 打印顺序可以自底向上追踪。它执行左孩子,然后是右孩子,然后打印节点。
    猜你喜欢
    • 2013-10-13
    • 1970-01-01
    • 2016-11-15
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 2016-12-29
    相关资源
    最近更新 更多