2012-05-06 36 views
-1

我有两个类,Progression和FibonacciProgression,但是FibonacciProgression会在下面的4和6上调用打印方法时打印出一些意想不到的结果。任何人都可以解释为什么这是?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。所以我不知道为什么第二个不启动像第一个一样? – mark

回答

2

当你调用printProgression秒时间参数6的prev值不重置为它的初始值。 prev仍然包含上次调用的值7。您需要在FibonacciProgression中保存value2,并在调用FibonacciProgressionfirstValue时重置prev。像这样:

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