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?我不明白:(
minindex在findShortestString 返回之前不会分配,直到返回为止lo == hi.
每次方法调用本身,它缩小了差别之间lo和hi1,所以最终他们将等于*和值将被退回.
一个例子,有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,hi并minindex保存关闭(在一个结构称为"堆栈"),并改为使用新的值.当方法的每次调用返回时,先前保存的值minindex将从堆栈"弹出"以供使用,并从先前的返回值分配.
*除非lo> hi开始,我猜......