Fibonacci Numbers A simple example of program design 26-Jul-16 Purpose of this presentation The whole point of this presentation is to give you some idea of how to put together the components we have so far (declarations, assignments, if and while statements) into a working program The example we use is writing a program to compute and display a Fibonacci sequence Fibonacci sequences A Fibonacci sequence is an infinite list of integers The first two numbers are given Usually (but not necessarily) these are 1 and 1 Each subsequent number is the sum of the two preceding numbers: 1 1 2 3 5 8 13 21 34 55 89 144 ... Let’s write a program to compute these Starting the Fibonacci sequence We need to supply the first two integers int first = 1; int second = 1; We need to print these out: System.out.print(first + " "); System.out.print(second + " "); We need to compute and print the next number: int next = first + second; System.out.print(next + " "); Taking the next step We need to compute and print the next number: int next = first + second; System.out.print(next + " "); Now what? We don't want to make up a lot more names If we use a loop, we must reuse names Preparing for another step This computation gave us our third number: int next = first + second; System.out.print(next + " "); The sequence so far is: first second next To get another number, we need second + next Variable first is no longer useful for anything Let’s move values around so that first + second does the job we need Preparing to make many steps We need to make these moves: first second next first second next first second next 1 1 2 1 2 3 2 3 5 We can do it like this: first = second; 3 5 8 second = next; We can put these statements in a loop and do them as many times as we please The program so far int first = 1; int second = 1; System.out.print(first + " "); System.out.print(second + " "); while ( ? ? ? ) { // when do we stop? int next = first + second; System.out.print(next + " "); first = second; second = next; } Deciding when to stop Suppose we stop when we get to a number that’s 1000 or bigger So we continue as long as the number is less than 1000: while (next < 1000) { ... } Question: is the final number printed greater than 1000 or less than 1000? while (next < 1000) { int next = first + second; System.out.print(next + " "); first = second; second = next; } One other minor detail We have been printing the numbers all on one line We’ll get to 1000 quickly enough, so we won’t have a terribly long line For neatness’ sake, we really ought to end the line (rather than hoping Java does it for us): System.out.println( ); The program so far int first = 1; int second = 1; System.out.print(first + " "); System.out.print(second + " "); while (next < 1000) { // oops--a bug int next = first + second; System.out.print(next + " "); first = second; second = next; } System.out.println( ); Fixing the bug The first time we see the variable next, it’s in the test of the while loop: while (next < 1000) { next hasn’t been given a value yet next hasn’t even been declared! Solution: declare next up with the other variables, and give it some reasonable initial value The (fixed) program so far int first = 1; int second = 1; int next = 2; System.out.print(first + " "); System.out.print(second + " "); while (next < 1000) { next = first + second; // "int" was removed System.out.print(next + " "); first = second; second = next; } System.out.println( ); Finishing up We have the commands we need, but we do not have a complete application We need to put the commands into a method We need to put the method into a class The next slide shows the extra stuff we need, but doesn’t explain it The “box” our program goes in public class Fibonacci { public static void main(String args[ ]) { (code goes here) } } The complete final program public class Fibonacci { public static void main(String args[ ]) { int first = 1; int second = 1; Our code int next = 2; System.out.print(first + " "); System.out.print(second + " "); while (next < 1000) { next = first + second; System.out.print(next + " "); first = second; second = next; } System.out.println( ); } } The End