2017-07-11 3 views
0

これはLeetCode質問、尋ねていることつの連結された数字を合計することで、例えば
入力である:(2 - > 4 - > 3)+(5 - > 6 - > 4)
出力: 7 - > 0 - > 8変数が再帰的にどのように流れますか?

質問:
次のコードを使用し、再帰的方法、すべての再帰呼び出し(最後の行の3番目の)新しいresultを構築します、私はなぜそのまわりで私の頭をラップする難しさを持っています古いresultは新しいresultで上書きされませんか?これは、resultが異なるスコープに属しているためです(たとえば、scope1.result、scope2.result?

/** 
* Definition for singly-linked list. 
* public class ListNode { 
*  int val; 
*  ListNode next; 
*  ListNode(int x) { val = x; } 
* } 
*/ 
public ListNode op(ListNode l1, ListNode l2, int carry) { 

    if (l1==null && l2==null) { 
     return carry==0 ? null: new ListNode(carry); 
    } 

    if (l1==null && l2!=null) { 
     l1 = new ListNode(0); 
    } 

    if (l1!=null && l2==null) { 
     l2 = new ListNode(0); 
    } 

    int sum = l1.val + l2.val + carry; 
    ListNode result = new ListNode(sum % 10); 
    result.next = op(l1.next, l2.next, sum/10); 
    return result; 
} 
+1

何が([スタックフレーム]と呼ばれて探しているhttps://stackoverflow.com/questions/10057443/explain-the-concept-of -a-stack-frame-in-a-nutshell)(または* callstack *)を使用します。 –

答えて

0

ローカル変数は、呼び出しに固有です。したがって、長さ3の2つのリンクされたリストでこれを行う場合、呼び出しのインスタンスに対してローカルな4 resultsumがあります。

実際、再帰関数はJavaでは特別な扱いを受けていません。すべての関数は、それぞれ独自のローカル変数とパラメータを取得します。例えば:

public int test1(int n) { 
    int y = 2*n; 
    return y + test2(n+1); 
} 

public int test2(int n) { 
    int y = 3*n; 
    return y - n/3; 
} 

これは、すべての再帰的ではありませんが、両方は、変数nを持っており、y。変数がローカルでなかった場合test1(3)test2以来23test1yを変更しているだろうとなって、しかしでしょうny両方がy滞在6結果として15を持つ各メソッドの呼び出しにローカルなので。

このメソッドは、その実行に新しい変数セットを取得した場合にメソッドを呼び出すと、呼び出し元の変数が以前と同じになります。

これは可変バインディングであり、オブジェクトではありません。オブジェクトをメソッドに渡して、オブジェクトを変更してバインディングではなく変更した場合、変更はそのオブジェクトを指すすべての変数に影響します。例えば。

// Bad implementation of rounding up to nearest 10 by mutating box 
public int test(int[] n) { 
    if(n[0] % 10 == 0) 
    return n[0]; 
    n[0]++; // mutates array not binding 
    return test(n); 
} 

良く再帰バージョン:

public int test(int n) { 
    if(n % 10 == 0) 
    return n; 
    return test(n+1); 
} 
関連する問題