理解Java中的递归更好一点

Sno*_*man 2 java algorithm recursion

好吧,我对Java中的递归感到困惑.说我有以下代码:

static int findShortestString(String[] paths, int lo, int hi) {
        if(lo==hi)
            return lo;
        int minindex=findShortestString(paths,lo+1, hi);
        if(safeStringLength(paths[lo])<safeStringLength(paths[minindex]))
            return lo;
        return minindex;
Run Code Online (Sandbox Code Playgroud)

现在问题不是关于代码本身,而是关于递归如何工作.minindex被设置为等于递归调用.所以第一次运行函数并尝试将minindex设置为某个东西时,它会这样做,然后函数调用自身.但if语句什么时候运行呢?只有当minindex真正拥有真正的价值时它才会运行吗?我只是无法绕过这个.如果minindex导致函数递归并递归,那么if语句什么时候会被检查?当lo==hi?我不明白:(

Sim*_*onJ 5

minindexfindShortestString 返回之前不会分配,直到返回为止lo == hi.

每次方法调用本身,它缩小了差别之间lohi1,所以最终他们将等于*和值将被退回.

一个例子,有paths = ["p1", "path2", "longpath3"]:

lo = 0, hi = 2
lo != hi -> call findShortestString(paths, 1, 2)

  lo = 1, hi = 2
  lo != hi -> call findShortestString(paths, 2, 2)

    lo = 2, hi = 2
    lo == hi -> return lo (=2)

  lo = 1, hi = 2, minindex = 2
  length of "path2" < length of "longpath3" -> return lo (= 1)

lo = 0, hi = 2, minindex = 1
length of "p1" < length of "path2" -> return lo (= 0)

我试图使用越来越多的缩进来说明每个递归级别的变量值.在每次递归调用的开始,以前的值lo,himinindex保存关闭(在一个结构称为"堆栈"),并改为使用新的值.当方法的每次调用返回时,先前保存的值minindex将从堆栈"弹出"以供使用,并从先前的返回值分配.

*除非lo> hi开始,我猜......