【问题标题】:How exactly does a recursive method return a final value and assign its result(s)?递归方法究竟如何返回最终值并分配其结果?
【发布时间】:2016-06-13 19:44:16
【问题描述】:
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;
}

我对@9​​87654323@的递归调用的疑惑是:

  1. 每个递归调用之后 处究竟存储了什么?换句话说,more 会将 each 递归调用的结果叠加起来吗?
  2. 语句(在递归调用之后)result.setNext(more) 会在每个递归调用中执行吗?
  3. 最终的return 值将如何工作?

我了解递归的概念,并经历了其他各种答案。但是,return 语句的场景以及分配给more 的递归调用似乎有所不同,并且令人困惑。非常感谢对这种情况的简单解释。谢谢。

【问题讨论】:

  • 也许不要把它看作递归:把它看作“只是调用一个方法”。如果给addLists(a, b, c) 的电话是doSomething(a, b, c),你能回答这些问题吗?
  • 递归方法调用与非递归方法调用没有区别。被调用的方法最终会返回或抛出异常,仅此而已。第一种情况,调用方法的执行正常继续。
  • @AndyTurner ,请注意我理解递归的概念。造成混乱的是LinkedListNode more = addLists(a1,a2,a3) 的赋值语句。是否会一次性获取所有结果,然后分配给more
  • @PoojithJain 尊敬的,我认为你不明白。您认为“所有结果”是什么意思?该方法只有 1 个结果。就像一个名为 doSomething 的方法返回一个 LinkedListNode 一样,这是一个名为 addLists 的方法,它返回一个 LinkedListNode。该实例可能已经通过递归调用调用了setNext;但这与你无关,作为方法的调用者。

标签: java recursion linked-list return-value


【解决方案1】:

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

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

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

使用递归也是一样的。在某一时刻,它遇到了一个基本情况。在您的代码中 当两个节点都为空且carry 小于10 时。然后它通过返回完成,如果它是递归调用,则将添加该值并且该方法的此实例将返回等等。一直到初始callee 然后将继续以与我的示例中的两个 System.out.println 行相同的方式执行下一行。

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

【讨论】:

  • 非常感谢@Sylwester。我现在完全明白如何返回。澄清一下,请告诉我我是否正确地认为 result.setNext(more)return result 没有作为每个递归调用的一部分执行。
  • @PoojithJain result.setNext(more) 没有在最底层(最后一次)调用,也就是基本情况下完成,但是之前的每个人。每次都会执行 return 语句。这就是将值作为绑定变量more 或作为最终结果从方法传递给被调用者的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 2013-03-09
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多