2012-05-06 5 views
-1

ProgressionとFibonacciProgressionの2つのクラスがありますが、以下のようにprintメソッドが呼び出されたときに、FibonacciProgressionは予期しない結果を表示します。これはなぜ誰が説明することができますか?それは初期値だとjava - progression inheritance

public class Progression { 

    protected long first; 
    protected long cur; 

    Progression() { 
     cur = first = 0; 
    } 

    protected long firstValue() { 
     cur = first; 
     return cur; 
    } 

    protected long nextValue() { 
     return ++cur; 
    } 

    public void printProgression(int n) { 
     System.out.print(firstValue()); 
     for (int i = 2; i <= n; i++) { 
      System.out.print(" " + nextValue()); 
     } 
     System.out.println(); 
    } 

    public static void main (String[] args) { 
     Progression prog = new Progression(); 
     System.out.println("Default Progression: "); 
     prog.printProgression(10); 
    } 

} 

そして...

public class FibonacciProgression extends Progression { 

    protected long prev; 

    FibonacciProgression(long value1, long value2) { 
     first = value1; 
     prev = value2 - value1; 
    } 

    FibonacciProgression() { 
     this(0,1); 
    } 

    protected long nextValue() { 
     long temp = prev; 
     prev = cur; 
     cur += temp; 
     return cur; 
    } 

    public static void main (String[] args) { 
     Progression fibProg = new FibonacciProgression(2,5); 
     System.out.println("Default Progression: "); 
     fibProg.printProgression(4); 
     fibProg.printProgression(6); 
    } 

} 
+0

まあ、彼らは異なる結果を与える:2 5 7 12&2 9 11 20 31 51秒1が起動しない理由だから私は思ったんだけど簡単には、メインを切り替えないことを確認するには 最初のものと同じようにオフですか? – mark

答えて

2

あなたはパラメータ6とprintProgression秒の時間を呼び出している、prevの値がリセットされません。 prevには、最後の呼び出しの値7が含まれています。 firstValueFibonacciProgressionが呼び出されたときには、をFibonacciProgressionに保存し、prevをリセットする必要があります。このように:

protected long firstValue() { 
    prev = val2 - first; // val2 is value2 passed in constructor 
    return super.firstValue(); 
} 
+0

パーフェクト、ありがとう! – mark

1

あなたのprintProgressionは値を「破壊」します。

public static void main(String[] args) { 
    Progression fibProg = new FibonacciProgression(2, 5); 
    System.out.println("Default Progression: "); 
    fibProg.printProgression(4); 
    fibProg = new FibonacciProgression(2, 5); 
    fibProg.printProgression(6); 
} 
+1

'cur'を破壊しないので、' cur'は 'firstValue()'の呼び出しで初期値にリセットされます。 'prev'だけが破壊されます。 – taskinoor

+0

"cur"はリセットされるまで破壊されました。これは問題ありません。私はそれがほとんど言葉の選択だと思う。しかし、あなたはもちろん正しいです。 @markのアプローチの一般的な問題は、フィブラスのような計算をしようとしているにもかかわらず、系列が依存して2つの値によって決定されるときに、1つの値(この場合は最初)を保存/使用することだけです。 – esej

関連する問題