2016-10-24 10 views
0
ArithmSumRec(n) 
1. If n = 1 
1.1 return 1 
2. Else 
2.1 return ArithmSumRec(n-1) + n 

したがって、たとえばn = 5と計算すると、次のようになります。括弧の外だと5に何が起こるかJava再帰合計内訳

return ArithmSumRec(5-1) + 5; 
  1. しかし:この方法は、それはだ最初の時間を返すとき

    Executing ArithmSumRec(5) ⇒ 5 calls to ArithmSumRec(...) 
    ArithmSumRec(5) 
    ArithmSumRec(4) 
    ArithmSumRec(3) 
    ArithmSumRec(2) 
    ArithmSumRec(1) 
    return 1 // base case 
    return 1 + 2 (= 3) 
    return 3 + 3 (= 6) 
    return 6 + 4 (= 10) 
    return 10 + 5 (= 15) 
    

    は、しかし、私の質問は、今です。なぜメソッドは9を返さないのですか((5-1)+5 = 9?)、代わりに4を返しますか?そして、それはどこですか?+n

既に見つかっていないスレッドや、再帰的メソッドを完全に説明しているウェブサイトがある場合は、その点を非常に高く評価します。

+3

お待ちください、何をお尋ねしますか?再帰は、 'stop'パラメータが満たされるまで、メソッド内のメソッドを呼び出しています。 – DarmaniLink

+1

ArithmSumRec()関数が完全にポストされている可能性があります。 – ApolloSoftware

+1

式は「内側から外側」と評価されます。 'ArithmSumRec(5-1)+ 5'は' ArithmSumRec(4)+ 5'とまったく同じです。実際、javacが生成するバイトコードはどちらの場合でも同じになります。 javacは定数式 '5-1'を' 4'にインライン化します。 – yshavit

答えて

0

これは、操作の順序です。関数呼び出しは、追加よりも優先されます。このように、あなたは4を与えて...最初の操作は5-1で、

func(5-1) + 5 

を呼び出したときに今ランタイムシステムは、コールFUNC(4)を実行します。これが行われるた後、それは最終的に5

が異なる関数呼び出しで自分の状況を比較追加:

sqrt(5-1) + 5 

これはと、「5-1」の上に平方根の記号を有することに相当しますそれ以降は "+ 5"になります。これは、sqrt(4)+ 5、または7に単純化されます。これは9に評価されず(元の文が書かれているように)評価されず、3(sqrt(5-1 + 5)

これは役に立ちますか?

+0

うわー、はい。したがって、関数は(5-1)+5に優先順位があるため、これは最後まで続き、THEN、操作を待つインラインは+ n個の数値ですか? (5 * 2)(5 * 1)+3のように、3は最初の2つのかっこが計算されるのを待っていますか? – azemi

+0

まさに!実際には、それが私の学生に教える方法です。カッコ内のものが最初に来て、関数呼び出しに括弧が含まれるので、評価(** 5-1 **部分)*と*関数呼び出しの両方を終了しなければなりません。 *その後*最後に行うことができます** + 5 ** – Prune

+0

十分にありがとうございます。本当にそれをappriciate!乾杯。 – azemi

0

再帰呼び出しは、再帰を停止するまで何も返しません。

if (n==1) return 1; 

プログラムがそこにハングします。

しかし、あなたはリターン1を打ったとき、その後、全体の計算が明確であり、あなたが実際に数値を返すことができます。

5 + 4 + 3 + 2 + 1 = 15