java递归中的return

1,344 阅读3分钟

void方法

在结束条件中使用return后,return会按相反顺序一个一个返回递归过程中出现的参数。例如,在归并排序中:

步骤1:假如数组a包含的是0-10,第一个sort()从(a,0,10)一直递归到(a,0,1),再进行递归时,触发结束条件。return会从(a,0,1)开始返回一直到最初的(a,0,10)。

步骤2:由于第一个sort()的下一个操作是另一个sort()递归,所以return返回的参数,会成为第二个sort()的参数。由于(a,0,1)输入后成为sort(a,1,1)再次触发了结束条件,(a,0,1)被return返回,成为merge()的参数。

步骤3:接下来,return继续返回上一个参数(a,0,2),其中mid=1,sort(a,2,2)再次触发结束条件,(a,0,2)被return返回,于是merge(a,0,1,2)。

步骤4:接下来,return继续返回上一个参数(a,0,5),其中mid=2,sort(a,3,5),由于没有触发结束条件,递归继续。mid = 4,第一个sort(a,3,4),没有触发结束条件,递归继续。mid = 3,第一个sort(a,3,3)触发了结束条件,第二个sort(a,4,4)也触发了结束条件,于merge(a,3,3,4)。

步骤5:由于步骤4中,第一个sort()触发过结束条件,于是return返回了(a,3,4)之前的(a,3,5),其中mid = 4,执行第二个sort(a,5,5),触发了结束条件,于是merge(a,3,4,5)。

步骤6:接下来,return继续返回上一个参数(a,0,5),这次返回是对步骤4操作过程的返回,是第二个sort()的return的返回,因而执行merge(a,0,2,5)。

步骤7:接下来,第一个sort()的return返回(a,0,10),mid = 5,执行第二个sort(a,6,10),接下来类似步骤4-6的过程。最终merge(a,0,5,10)结束。

对以上过程检验:

打印结果如图:

#非void方法

这时,一般会有2个return,一个是结束条件是使用的return,这个return会返回定义的内容。在代码块的最后还有一个return,一般用于返回某个参数,这样在递归结束后,可以逐级返回各个操作层的参数。例如,二叉查找树的put方法的实现:

如果 x == null, 触发了结束条件,那么就会返回new Node(key,val,1),被赋值给x.left 或 x.right。而第二个return,会逐级返回之前执行的操作层的参数x,最后返回第一个x。一般会配合一个void方法:

public void put(Key key,Value val) { if (key == null) throw new IllegalArgumentException("calls put() with a null key"); if (val == null) { delete(key); return; } root = put(root,key,val); }

还有一种情况,return后面跟的还是个递归,例如floor方法:

这时不会逐级返回,如果触发结束条件,返回null,没有,返回t或x。