【问题标题】:How EXACTLY does recursion work in this case?在这种情况下,递归究竟是如何工作的?
【发布时间】:2019-01-05 05:53:39
【问题描述】:

我是这个论坛的新手,希望不要犯任何错误。 这是我的问题。我想我了解递归的基本原理及其实现,但我无法理解计算机在执行递归代码时执行的确切步骤。

这是一个例子:

公共类主{

public static void MyAlgorithm (int [] A, int l, int r ) {
    if (l<r) {
        int m = (l+r)/2;
        MyAlgorithm(A, l, m);

        for (int i = l; i<=r; i++) {
            System.out.println(A[i]);
        }

        MyAlgorithm(A, m+1, r);
    }


}
public static void main (String args[]) {

    int [] A = {1,2,3,4};

    MyAlgorithm (A, 0, 3);
}

}

输出为:12123434

但这究竟是如何工作的呢? 首先,代码将 m 计算为 2。然后在子数组 (1,2) 上再次执行该方法并将其放入堆栈。然后它再次这样做,取一半并将 1 放入堆栈。据我了解这个问题,它然后停止,从堆栈中弹出 1 并打印它。但是它什么时候将 2 单独放入堆栈?它到底什么时候从另一半开始递归部分? 我根本无法真正理解计算机如何执行单个步骤以及它如何“知道”何时开始递归调用数组的另一半。 希望您能理解我的问题,并感谢您的每一个回复!

提前致谢:)

【问题讨论】:

  • 方法调用是否递归并不会改变它的工作方式。每个执行一个接一个地执行。如果指令是方法调用,则方法中的所有指令都会被执行。
  • 用纸和铅笔尝试跟进执行情况。
  • 谢谢,JB Nizet。所以递归继续通过代码并最初“忽略”递归调用?但是为什么循环一开始不打印 1,2,3,4,因为在第一次调用期间 i=l 是 1 而 r 是 3?
  • 因为在打印 1,2,3,4 之前,递归调用了 MyAlgorithm(A,0,1)。请参阅下面的答案

标签: java recursion stack


【解决方案1】:

执行调用会是这样的

MyAlgorithm(A,0,3) 
    (l < r : true)
     m = (0+3)/2=1
     MyAlgorithm(A,0,1) 
            (l < r : true) 
            m = (0+1)/2=0
            MyAlgorithm(A,0,0) 
                (l < r : false) return

            loop from l=0 to r=1
            System.out.println(A[0]);
            System.out.println(A[1]);

            //MyAlgorithm(A,m+1,r)
            MyAlgorithm(A,1,1) 
                (l < r : false) return

    loop from 1=0 to r=3
    System.out.println(A[0]);
    System.out.println(A[1]);
    System.out.println(A[3]);
    System.out.println(A[4]);

    //MyAlgorithm(A,m+1,r)
    MyAlgorithm(A,2,3)
        (l < r : true)
        m=(2+3)/2 = 2
        MyAlgorithm(A,2,2)
            (l < r : false) return

    loop from 1=2 to r=3
    System.out.println(A[2]);
    System.out.println(A[3]);

    MyAlgorithm(A,3,3)
            (l < r : false) return      
return

这导致答案:12123434

【讨论】:

  • 感谢您的精彩回复,我想我现在得到了这个代码!
猜你喜欢
  • 2021-01-27
  • 2013-03-09
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
  • 2020-08-20
  • 1970-01-01
相关资源
最近更新 更多