Java  1.0
Fibonacci.java
Go to the documentation of this file.
1 
16 public class Fibonacci {
20  private long ncalls = 0;
24  private long[] fibs = null;
28  private int nf = 0;
29 
30  // Empty constructor
31  public Fibonacci () {}
32 
38  public Fibonacci ( int n ) {
39  Fibo(n-1);
40  }
41 
47  public static void main(String[] args) {
48  int n = 0;
49  if (args.length > 0) {
50  try {
51  n = Integer.parseInt(args[0]);
52  } catch (NumberFormatException e) {
53  System.err.println("Argument must be an integer");
54  System.exit(1);
55  }
56  }
57  Fibonacci f = new Fibonacci();
58  Fibonacci f2 = new Fibonacci(n);
59  f.fibo(n);
60  System.out.println(f2);
61  System.out.println(f);
62  System.out.println(String.format("%12s %12s %12s %12s", "N", "Fib(N)", "Dumb", "Smart"));
63  System.out.println(String.format("%12s %12s %12s %12s", "-------", "-------", "-------", "-------"));
64  for ( int i = 1; i <= n; ++i ) {
65  f.ncalls = 0;
66  long dumb_result = f.fiboDumb(i);
67  long dumb_count = f.ncalls;
68  long smart_result = f.fib(i);
69  long smart_count = f.ncalls;
70  System.out.println (String.format ("%12d %12d %12d %12d", i, smart_result, dumb_count, smart_count));
71  }
72  }
73 
79  public void fibo (int n) {
80  long n0 = 0, n1 = 1, n2; // Initialize variables of the series
81  System.out.print(n0 + " " + n1 + " "); // Print first and second terms
82 
83  for (int i = 0; i < n-2; i++) { // Loop for the next n terms
84  n2 = n1 + n0; // Next term is sum of previous two
85  System.out.print(n2 + " "); // Print it out
86  n0 = n1; // First previous becomes 2nd previous
87  n1 = n2; // And current number becomes previous
88  }
89  System.out.println("\n"); // Terminate the line
90  }
91 
100  public long fiboDumb (int n) {
101  ++ncalls;
102  if ( n <= 1 ) return n;
103  return fiboDumb(n-1)+fiboDumb(n-2);
104  }
105 
115  public long fib (int n) {
116  this.ncalls = 0;
117  return fib (n,0,1);
118  }
119 
129  private long fib (int n, long s1, long s2) {
130  ++ncalls;
131  if (n<=1)
132  return s1;
133 
134  return fib(n-1,s1+s2,s1);
135  }
136 
144  public long Fibo ( int n ) {
145  ++ncalls;
146 
147  if ( n <= 1 ) return n;
148 
149  if ( nf == 0 ) {
150  if ( fibs == null || fibs.length <= n )
151  fibs = new long [n+1]; // Each class variable, instance variable, or array component is initialized
152  // with a default value when it is created (§15.9, §15.10) [...]
153  // For type int, the default value is zero, that is, 0.
154  nf = n;
155  }
156 
157  if ( fibs[n-1]==0 ) fibs[n-1] = Fibo(n-1);
158  if ( fibs[n-2]==0 ) fibs[n-2] = Fibo(n-2);
159 
160  long f = fibs[n] = fibs[n-1]+fibs[n-2];
161  if ( n == nf )
162  nf = 0;
163 
164  return f;
165  }
166 
172  public String toString() {
173  String s = "";
174  if ( fibs != null ) {
175  for ( int i = 0; i < fibs.length; ++i )
176  s += Long.toString (fibs[i]) + " ";
177  s += String.format("\nNumber of calls = %d\n", ncalls);
178  }
179  return s;
180  }
181 }
Fibonacci.nf
int nf
hold the number of terms to be generated
Definition: Fibonacci.java:28
Fibonacci
Class for generating the Fibonacci sequence.
Definition: Fibonacci.java:16
Fibonacci.fib
long fib(int n, long s1, long s2)
Generates a Fibonacci number using a recursive algorithm that makes only n recursive calls.
Definition: Fibonacci.java:129
Fibonacci.Fibo
long Fibo(int n)
Generates a Fibonacci number using a recursive algorithm that makes only n recursive calls.
Definition: Fibonacci.java:144
Fibonacci.ncalls
long ncalls
hold the number of recursive calls
Definition: Fibonacci.java:20
Fibonacci.Fibonacci
Fibonacci()
Definition: Fibonacci.java:31
Fibonacci.fib
long fib(int n)
Generates a Fibonacci number using a recursive algorithm that makes only n recursive calls.
Definition: Fibonacci.java:115
Fibonacci.fibs
long[] fibs
hold the Fibonacci sequence
Definition: Fibonacci.java:24
Fibonacci.Fibonacci
Fibonacci(int n)
Constructs a Fibonacci sequence from 0 to n-1.
Definition: Fibonacci.java:38
Fibonacci.main
static void main(String[] args)
Main function for testing.
Definition: Fibonacci.java:47
Fibonacci.toString
String toString()
Used to print a Fibonacci object.
Definition: Fibonacci.java:172
Fibonacci.fibo
void fibo(int n)
Prints the Fibonacci sequence.
Definition: Fibonacci.java:79
Fibonacci.fiboDumb
long fiboDumb(int n)
This is a naive recursive version.
Definition: Fibonacci.java:100