递归方法究竟如何返回最终值并分配其结果?

时间:2016-06-13 19:44:16

标签: java recursion linked-list return-value

LinkedListNode addLists(LinkedListNode l1, LinkedListNode l2, int carry) {

    if(l1 == null && l2 == null && carry == 0) {
      return null;
    }

    LinkedListNode result = new LinkedListNode(carry,null,null);
    int value = carry;
    if(l1 != null) 
      value += l1.data;

    if(l2 != null)
      value += l2.data;

    result.data = value % 10;

    //Recursive call
    if(l1 != null || l2 != null || value >= 10) {
      LinkedListNode more = addLists(l1 == null? null : l1.next,
                                     l2 == null? null : l2.next,
                                     value >= 10? 1 : 0);
      result.setNext(more);
    }
    return result;
}

我对addLists(arg1,arg2,arg3)的递归调用的怀疑是:

  1. 每次递归调用后,more 的确切存储内容是什么?换句话说,more是否会叠加每次递归调用的结果?
  2. 是否会在每次递归调用中执行语句(在递归调用之后)result.setNext(more)
  3. 最终的return值如何运作?
  4. 我理解递归的概念,并经历了各种其他答案。但是,return语句以及分配给more的递归调用的情况似乎有所不同,并使其混淆。真的很感激这个场景的简单解释。谢谢。

1 个答案:

答案 0 :(得分:3)

它可能感觉像魔术,但事实并非如此。在您的代码中,您可以按顺序调用方法:

System.out.println("first line");
System.out.println("second line");

但你永远不会质疑它为什么打印“第二行”。当“第一行”的打印完成时,它恢复执行。

使用递归也是一样的。有一次,它击中了一个基础案例。在你的代码中 当两个节点都为空且carry小于10时,它就会返回。如果是递归调用,则会添加该值,并且该方法的实例将返回等一直到初始被调用者然后将以与我的示例中的两个System.out.println行相同的方式继续执行下一行。

每次调用方法时,变量都与前一个不同。因此,即使有10个级别的通话,它们都有自己的l1l2carry,甚至more,并且当它们都会继续下一行时current方法返回就像任何其他方法一样。递归方法并不特别!