2016-05-02 13 views
-4

なぜ私は知りませんが、私はこの再帰をトレースして、私の死と本当に私を怒らせます。誰かがこれをどうやってどうやって説明するのを助けることができるなら、私は大好きです。この再帰の理解が必要

public class MindNumber 
{ 

    public static int numb(int i) 
    { 
    int result; 


    if (i < 1) 
    { 
     result = -1; 

    } 
    else if (i < 10) 
    { 
     result = numb(i - 1) + numb(i - 2); 

    } 
    else if (i % 2 == 0) 
    { 
     result = numb(i/2); 
    } 
    else 
    { 
     result = numb(i/2) + numb(i % 2); 

    } 

    return result; 
    } 
} 

public class MindNumberDriver 
{ 
    public static void main(String[] args) 
    { 
    int i; 

    i = MindNumber.numb(12); 

    System.out.println(i); 

    } 
} 

出力は-21です。これが正直にどのようになっているのか理解していない。

+6

あなたのデバッガでコードをステップ実行することをお勧めします。 –

+0

あなたはこれを書きましたか?あなたはそれが何か他のことをすることを期待していますか?もしそうなら、何? – shmosel

+5

紙を取り出し、すべての通話を書き留めてみてください。 – mariusz2108

答えて

1

を私は12を=起動するので、我々は無感覚返す第三の条件を入力してください(6)

麻痺(6)麻痺(5)+麻痺を返します(4 )

無感覚(5)を返し麻痺(4)+麻痺(3)

麻痺(4)麻痺(3)+麻痺(2)

麻痺(3)返し麻痺(2) +麻痺(1)

麻痺(2)(1)麻痺(1)+麻痺(0)=麻痺(1)+(-1)

麻痺が麻痺(0)+麻痺(-1)=を(返し - 1)+(-1)=(-2)

ここで、コールスタックをウォークバックすることができます。

(0)=(-2)+(-1)=(-3)

麻痺(3)麻痺(2)+麻痺を返す(2)麻痺(1)+麻痺を返し麻痺(1 )=(-3)+(-2)=(-5)

... ect

+0

ありがとう、どうしたのですか?私はインデックスカードのトリックを使用して:) – CabDude

2

これは9までの範囲1における番号の負フィボナッチ数列である:

-1, -1, -2, -3, -5, -8, -13, -21, -34, ... 
f(6) = 21 

ここで重要なステップは、I < 1及びI < 10の他の2つは単に翻訳は、最初の2つの条件節であります:ここ

If **i** is even, recur using half that value; 
otherwise, recur using half the value rounded up. 

実行は、私は12を=

です。 12/2、または6で繰り返す。
i = 6; return -f(6)

実行をトレースする場合は、非常に古い、ハイテクのデバッグ手法を使用します。実行文とデータフローをトレースするためにprint文を使用します。ルーチンを入力すると、引数が表示されます。退室する直前に、戻ってくる価値を印刷してください。あなたがその行動に従うことができるように、各印刷にラベルを付けます。あなたがプロセスを歩く支援するため