Java返回与递归函数

Пирогов

我开始学习Java。我有一个要做递归函数的任务。我一直在寻找有关Java递归的信息,并发现了一些有趣的代码。我不明白,当n等于10时,为什么在“返回”之后n等于9。然后,当k等于9时,在“返回”之后k = 10。

 public class lvl22666 {

    public static void main(String[] args) {
        recTest(0,10);
    }

    static void recTest(int n, int k) {
        if (n == k) {
            return;
        } else {
            if (n < k) {
                n++;
                System.out.println(n + " " + k);
                recTest (n,k);
            }
            if (k > n) {
                k--;
                System.out.println(n + " " + k);
                recTest (n,k);
            }
        }
    }
}
罗伯特·哈维

所有递归方法都有三件事:

  1. 退出条件,以防止无限循环
  2. 工作项,以及
  3. 递归调用。

递归函数中的退出条件是:

if (n == k)
   return;

工作项目是:

n++;
System.out.println(n + " " + k);

除非k大于n,否则工作项为:

k--;
System.out.println(n + " " + k);

递归调用为:

recTest (n,k);

请注意,由于返回值会使您提前退出该方法,因此该else语句不是必需的。

要了解递归方法的行为,您必须首先了解什么是堆栈框架,堆栈如何工作以及如何用于保持方法调用之间的状态。

当Java准备调用方法时,它会将包括其参数(统称为方法的“状态”)和调用方法的返回地址在内的调用方法的局部变量放入堆栈框架,并将该堆栈框架推入堆栈。然后,它调用新方法。

当Java从某个方法返回时,它会将堆栈框架弹出堆栈,从而恢复调用方法的原始状态。

堆叠就像您在旋转木马上以50年代的晚餐看到的盘子堆叠一样。堆叠中的第一个盘子是洗碗机放在其中的最后一个盘子。我们将此称为后进先出(LIFO)队列。

稍加想象,您就可以看到连续调用递归方法如何保持每次递归期间对状态所做的任何更改的运行历史记录。由于状态的副本是在每次递归过程中保存的,因此您可以通过从方法调用返回来返回状态的上一步。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章