2012-05-06 3 views
-1

У меня есть два класса: Progression и FibonacciProgression, однако FibonacciProgression распечатывает некоторые неожиданные результаты, когда метод печати вызывается на 4 и 6, как показано ниже. Может ли кто-нибудь объяснить, ПОЧЕМУ это?java - наследование прогрессии

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. Таким образом, я задаюсь вопросом, почему второй один не запускается как первый? – mark

ответ

2

Когда вы звоните printProgression второй раз с параметром 6, значение prev не сбрасывается в это начальное значение. prev все еще содержит значение 7 от последнего вызова. Вам необходимо сэкономить value2 в FibonacciProgression и сбросить prev, когда вызывается firstValue из FibonacciProgression. Например:

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

Отлично, спасибо! – mark

1

Ваш printProgression «разрушает» значение prev. Чтобы легко видеть, что он делает, переключите основной для:

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 заключается в том, что он пытается выполнить вычисление, подобный фибулю, но только сохраняет/использует одно значение (в этом случае сначала) - когда серия зависит и определяется двумя значениями. – esej

Смежные вопросы