2016-08-11 13 views
1
public void length() { 
    System.out.println(length(head, 0)); 
} 
public int length(Node he, int count) { 
    if(he!=null) { 
     // System.out.println(he.data +" "+count++); 
     // count++; 
     // return length(he.next, count); 
     return length(he.next, count++); 
    } 
    return count; 
} 

上記のコードでは、リンクされたリストの長さを見つける必要があります。同じコードを実行すると長さが0になりますが、コメント付きのコードを使用すると正しい長さが得られます。なぜそれが起こっているのですか?Javaを使用した再帰に基づく

+1

'数++'実際に 'count'を渡し、[この質問を参照してくださいどのようにポストインクリメントが動作する](http://stackoverflow.com/questions/2371118/how-do-the-post-increment-i--pre-increment-i-operators-work-in-java) – SomeJavaGuy

+0

2番目のパラメータを削除して単純に ' return(he == null)? 0:1 +長さ(he.next); '? – fabian

+0

おかげで@ fabian ..私は実際にあなたを介して他の方法を見つけた。 :) –

答えて

5

length(he.next, count++)は、ポストインクリメント演算子を使用しているため、countの元の値をメソッド呼び出しに渡します。したがって、常に

length(he.next, ++count)となります。ここでは、増分値countが渡されます。

コメント付きコードでは、count++の値をメソッド呼び出しに渡していません。すでにインクリメントされている場合はcountが渡されます。

+0

しかし、コードは再帰的であり、次の再帰ステップのために..それは右に増加しなければならないのですか?反復的なステップで起こるのと同じように?なぜ再帰で起こらなかったのですか? –

+0

@Krishnakrishあなたが何を意味するのか分かりません。それぞれの再帰呼び出しに 'count'のインクリメントされていない値を渡しています。 (StackOverflowErrorを生成する代わりに)再帰が終了する唯一の理由は、停止条件が、渡された 'Node'(各再帰呼び出しが進む)と、渡された' count'(常に0)に依存しないことです。 – Eran

+0

@Eranは、以前の呼び出しスタックが完了した後に値がインクリメントされることを期待しているようですが、そうではありません。再帰的メソッドへの引数として渡される変数は、その特定の再帰呼び出しスタックの一部だけです – JavaHopper

0

使用

return length(he.next, ++count);

または

System.out.println(he.data +" "+count); 
count++; 
return length(he.next, count); 

私はあなたと私のコードをシミュレートしようとします。

あなたのコード:

//count = 0 

length(he.next, count++) // length(he.next, 0) 

//after recursion call count increments , count = 1 

マイコード:

//count = 0 

// before recursion call, ++count increments count 

// count = 1 

length(he.next, ++count) // length(he.next, 1) 

みんなイムここに新しいイム間違っている場合は、私を編集してください:)

+0

しかし、コードは再帰的であり、次の再帰的ステップのために..それは右に増加しなければなりませんか?反復的なステップで起こるのと同じように?なぜ再帰で起こらなかったのですか? –

+0

はい、増分する必要があります。実際にはカウントをインクリメントしていますが、再帰呼び出し後にインクリメントが発生します。そのため、countの古い値(0)を渡しています。 – burakozgul

関連する問題