Fibonacci Notebook
/*
* Creator: Nighthawk Coding Society
* Mini Lab Name: Fibonacci sequence, featuring a Stream Algorithm
*
*/
import java.util.ArrayList;
import java.util.HashMap;
import java.util.stream.Stream;
/* Objective will require changing to abstract class with one or more abstract methods below */
public class Fibo {
String name; // name or title of method
int size; // nth sequence
int hashID; // counter for hashIDs in hash map
ArrayList<Long> list; // captures current Fibonacci sequence
HashMap<Integer, Object> hash; // captures each sequence leading to final result
/*
Zero parameter constructor uses Telescoping technique to allow setting of the required value nth
@param: none
*/
public Fibo() {
this(20); // telescope to avoid code duplication, using default as 20
}
/*
Construct the nth fibonacci number
@param: nth number, the value is constrained to 92 because of overflow in a long
*/
public Fibo(int nth) {
this.size = nth;
this.list = new ArrayList<>();
this.hashID = 0;
this.hash = new HashMap<>();
//initialize fibonacci and time mvc
this.init();
}
/*
This Method should be "abstract"
Leave method as protected, as it is only authorized to extender of the class
Make new class that extends and defines init()
Inside references within this class would change from this to super
Repeat process using for, while, recursion
*/
protected void init() {
this.name = "Stream";
Stream.iterate(new long[]{0, 1}, f -> new long[]{f[1], f[0] + f[1]})
.limit(this.size)
.forEach(f -> this.setData(f[0]) );
}
/*
Number is added to fibonacci sequence, current state of "list" is added to hash for hashID "num"
*/
public void setData(long num) {
list.add(num);
hash.put(this.hashID++, list.clone());
}
/*
Custom Getter to return last element in fibonacci sequence
*/
public long getNth() {
return list.get(this.size - 1);
}
/*
Custom Getter to return last fibonacci sequence in HashMap
*/
public Object getNthSeq(int i) {
return hash.get(i);
}
/*
Console/Terminal supported print method
*/
public void print() {
System.out.println("Init method = " + this.name);
System.out.println("fibonacci Number " + this.size + " = " + this.getNth());
System.out.println("fibonacci List = " + this.list);
System.out.println("fibonacci Hashmap = " + this.hash);
for (int i=0 ; i<this.size; i++ ) {
System.out.println("fibonacci Sequence " + (i+1) + " = " + this.getNthSeq(i));
}
}
/*
Tester class method. If this becomes abstract you will not be able to test it directly ...
Change this method to call "main" class of each of the extended classes
*/
static public void main(String[] args) {
Fibo fib = new Fibo();
fib.print();
}
}
Fibo.main(null);
public class FiboForLoop extends Fibo {
protected void init() {
this.name = "For";
long limit = this.size;
// for loops are likely the most common iteration structure, all the looping facts are in one line
for (long[] f = new long[]{0, 1}; limit-- > 0; f = new long[]{f[1], f[0] + f[1]})
this.setData(f[0]);
}
static public void main(String[] args) {
FiboForLoop fib = new FiboForLoop();
fib.print();
}
}
FiboForLoop.main(null);
public class FiboWhileLoop extends Fibo {
protected void init() {
this.name = "While";
long limit = this.size;
long[] f = new long[]{0, 1};
while (limit-- > 0) {
this.setData(f[0]);
f = new long[]{f[1], f[0] + f[1]};
}
}
static public void main(String[] args) {
FiboWhileLoop fib = new FiboWhileLoop();
fib.print();
}
}
FiboWhileLoop.main(null);
public class FiboRecursive extends Fibo{
public void recursion(long limit, long[] f) {
if (limit == 0) return;
this.setData(f[0]);
recursion(--limit, new long[]{f[1], f[0] + f[1]});
}
protected void init() {
this.name = "Recursion";
long limit = this.size;
long[] f = new long[]{0, 1};
recursion(limit,f);
}
static public void main(String[] args) {
FiboRecursive fib = new FiboRecursive();
fib.print();
}
}
FiboRecursive.main(null);
College Board Standards
-
Skill 1.B: Determine code that would be used to complete code segments (ie For, While, Recursion)
- When extending the Fibo class you had to pick the specific segment of code that would have to be put in the for/while/recursive loop
-
Skill 4.C: Determine if two or more code segments yield equivalent results (be sure to Discuss how you know results are the same)
- We determined that there were 4 different ways to produce the same fibonacci code, with either stream, or a for/while/recursive loop
-
Skill 5.A: Describe the behavior of a given segment of program code (describe the difference in recursion versus for & while loops, perhaps add timing to determine speed)
- The 4 different methods have 4 different speeds and efficiencies.
- The recursion code segment iterates by running the function called "recursion", which called the setdata method, and then re-runs itself by calling itself, and reducing limit by 1 each time, until limit = 0.
- The while loop does the same as the recursive loop, but instead of calling itself over and over again, the loop is built into the "while" statement, which loops while (limit-- > 0), which reduces limit each time by 1.