2016-06-13 19 views
2
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值如何工作?

我理解遞歸的概念,並且經歷了各種其他的答案。然而,return聲明以及遞歸呼叫被分配到more的情況看起來不同,並且使其令人困惑。真的很感謝這個場景的簡單解釋。謝謝。

+0

也許不要認爲它是遞歸:把它想成「只是調用一個方法」。如果對'addLists(a,b,c)'的調用是'doSomething(a,b,c)',你能回答這些問題嗎? –

+0

遞歸方法調用與非遞歸方法調用沒有區別。被調用的方法最終返回或拋出異常,就是這樣。在第一種情況下,調用方法的執行正常繼續。 –

+0

可能重複[這裏的遞歸如何工作?](http://stackoverflow.com/questions/2406824/how-does-the-recursion-here-work) – Prune

回答

3

它可能感覺像魔術,但它確實不是。在你的代碼可能會依次調用的方法是這樣的:

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

但你永遠不問爲什麼它打印「二線」。當「第一行」的打印完成時,它恢復執行。

遞歸它是一樣的。有一次它擊中了一個基本案例。在你的代碼 它的兩個節點都爲空,而carry小於10.然後它通過返回結束,如果它是一個遞歸調用,該值將被添加,並且該方法的這個實例將返回等等。最初的被調用者然後將繼續執行下一行,與我的示例中的兩行System.out.println行相同。

每次調用某個方法時,變量都會與前一次不同。因此,即使有10個級別的呼叫,他們都有自己的l1,l2,carry,甚至more,並且噹噹前方法返回時,它們都將繼續下一行,如同任何其他方法一樣。遞歸方法並不特別!

+0

非常感謝,@Sylwester。我現在完全瞭解如何完成回國。爲了澄清,請告訴我,如果我認爲'result.setNext(more)'和'return result'不會作爲每次遞歸調用的一部分執行。 –

+0

@PoojithJain'result.setNext(更多)'不是在底部(最後)調用,也就是基本情況下完成的,但是之前的每個人都完成了。 return語句每次都執行。它是如何將一個值從方法傳遞給被調用者作爲綁定變量'more'或作爲最終結果。 – Sylwester