+ All Categories
Home > Documents > Iteration

Iteration

Date post: 07-Jan-2016
Category:
Upload: mizell
View: 17 times
Download: 0 times
Share this document with a friend
Description:
Iteration. Chapter 4 Spring 2007 CS 101 Aaron Bloomfield. Java looping. Options while do-while for Allow programs to control how many times a statement list is executed. Averaging values. Averaging. Problem - PowerPoint PPT Presentation
125
1 Iteration Chapter 4 Spring 2007 CS 101 Aaron Bloomfield
Transcript
Page 1: Iteration

1

Iteration

Chapter 4Spring 2007CS 101Aaron Bloomfield

Page 2: Iteration

2

Java looping Options

while do-while for

Allow programs to control how many times a statement list is executed

Page 3: Iteration

33

Averaging valuesAveraging values

Page 4: Iteration

4

Averaging Problem

Extract a list of positive numbers from standard input and produce their average Numbers are one per line A negative number acts as a sentinel to indicate that

there are no more numbers to process

Observations Cannot supply sufficient code using just assignments and

conditional constructs to solve the problem Don’t how big of a list to process

Need ability to repeat code as needed

Page 5: Iteration

5

Averaging Algorithm

Prepare for processing Get first input While there is an input to process do {

Process current input Get the next input

} Perform final processing

Page 6: Iteration

6

Averaging Problem

Extract a list of positive numbers from standard input and produce their average Numbers are one per line A negative number acts as a sentinel to indicate that

there are no more numbers to process

Sample runEnter positive numbers one per line.Indicate end of list with a negative number.4.50.51.3-1Average 2.1

Page 7: Iteration

public class NumberAverage {// main(): application entry pointpublic static void main(String[] args) {

// set up the input

// prompt user for values

// get first value

// process values one-by-onewhile (value >= 0) {

// add value to running total// processed another value// prepare next iteration - get next value

}

// display resultif (valuesProcessed > 0)

// compute and display averageelse

// indicate no average to display}

}

Page 8: Iteration

int valuesProcessed = 0;double valueSum = 0;

// set up the input

Scanner stdin = new Scanner (System.in);

// prompt user for values

System.out.println("Enter positive numbers 1 per line.\n" + "Indicate end of the list with a negative number.");

// get first value

double value = stdin.nextDouble();

// process values one-by-one

while (value >= 0) {valueSum += value;++valuesProcessed;value = stdin.nextDouble();

}

// display result

if (valuesProcessed > 0) {double average = valueSum / valuesProcessed;System.out.println("Average: " + average);

} else {System.out.println("No list to average");

}

Page 9: Iteration

99

Program DemoProgram Demo

NumberAverage.javaNumberAverage.java

Page 10: Iteration

10

While syntax and semantics

Logical expression thatdetermines whether Action

is to be executed

while ( Expression ) Action

Action is either a singlestatement or a statement

list within braces

Page 11: Iteration

11

While semantics for averaging problem

// process values one-by-onewhile ( value >= 0 ) {

// add value to running totalvalueSum += value;

// we processed another value++valueProcessed;

// prepare to iterate – get the next inputvalue = stdin.nextDouble();

}

Test expression is evaluated at thestart of each iteration of the loop.

If test expression is true, these statementsare executed. Afterward, the test expression

is reevaluated and the process repeats

Page 12: Iteration

12

While Semantics

Expression

Action

true false

Expression isevaluated at the

start of eachiteration of the

loop

If Expression istrue, Action is

executed If Expression isfalse, program

executioncontinues with

next statement

Page 13: Iteration

13

int valuesProcessed = 0;double valueSum = 0;

double value = stdin.nextDouble();

while (value >= 0) {valueSum += value;++valuesProcessed;value = stdin.nextDouble();

}

if (valuesProcessed > 0) {double average = valueSum / valuesProcessed;System.out.println("Average: " + average);

}else {

System.out.println("No list to average");}

int valuesProcessed = 0;double valueSum = 0;

double value = stdin.nextDouble();

while (value >= 0) {valueSum += value;++valuesProcessed;value = stdin.nextDouble();

if (valuesProcessed > 0) {double average = valueSum / valuesProcessed;System.out.println("Average: " + average);

Execution Trace

Suppose input contains: 4.5 0.5 1.3 -1

0valuesProcessed

valueSum 0

value 4.5

Suppose input contains: 4.5 0.5 1.3 -1

4.5

1

Suppose input contains: 4.5 0.5 1.3 -1

0.5

5.0

2

1.3

6.3

Suppose input contains: 4.5 0.5 1.3 -1

3

-1

Suppose input contains: 4.5 0.5 1.3 -1

average 2.1

Page 14: Iteration

1414

What do these pictures What do these pictures mean?mean?

Light beerLight beer Dandy lionsDandy lions Assaulted Assaulted

peanutpeanut EggplantEggplant Dr. PepperDr. Pepper Pool tablePool table Tap dancersTap dancers Card sharkCard shark King of popKing of pop I PodI Pod Gator aideGator aide Knight mareKnight mare Hole milkHole milk

Page 15: Iteration

1515

Converting text to lower caseConverting text to lower case

Page 16: Iteration

16

Converting text to strictly lowercasepublic static void main(String[] args) {

Scanner stdin = new Scanner (System.in);

System.out.println("Enter input to be converted:");

String converted = "";

while (stdin.hasNext()) { String currentLine = stdin.nextLine(); String currentConversion =

currentLine.toLowerCase(); converted += (currentConversion + "\n");}

System.out.println("\nConversion is:\n" + converted);

}

Page 17: Iteration

17

Sample run

A Ctrl+z wasentered. It is theWindows escape

sequence forindicatingend-of-file

An empty linewas entered

Page 18: Iteration

1818

Program DemoProgram Demo

LowerCaseDisplay.javaLowerCaseDisplay.java

Page 19: Iteration

19

Program trace

public static void main(String[] args) {

Scanner stdin = new Scanner (System.in);

System.out.println("Enter input to be converted:");

String converted = "";

while (stdin.hasNext()) { String currentLine = stdin.nextLine(); String currentConversion =

currentLine.toLowerCase(); converted += (currentConversion + "\n");}

System.out.println("\nConversion is:\n" + converted);

}

public static void main(String[] args) {

Scanner stdin = new Scanner (System.in);

System.out.println("Enter input to be converted:");

String converted = "";

while (stdin.hasNext()) { String currentLine = stdin.nextLine(); String currentConversion =

currentLine.toLowerCase(); converted += (currentConversion + "\n");}

System.out.println("\nConversion is:\n" + converted);

}

Page 20: Iteration

20

Program trace

Representation of lower caseconversion of current input line

converted += (currentConversion + "\n");

The append assignment operator updates the representationof converted to include the current input line

Newline character is neededbecause method nextLine()

"strips" them from the input

Page 21: Iteration

2121

Another optical illusionAnother optical illusion

Page 22: Iteration

2222

Loop Design & Reading From Loop Design & Reading From a Filea File

Page 23: Iteration

23

Loop design Questions to consider in loop design and analysis

What initialization is necessary for the loop’s test expression?

What initialization is necessary for the loop’s processing?

What causes the loop to terminate?

What actions should the loop perform?

What actions are necessary to prepare for the next iteration of the loop?

What conditions are true and what conditions are false when the loop is terminated?

When the loop completes what actions are need to prepare for subsequent program processing?

Page 24: Iteration

24

Reading a file Background

Same Scanner class!

Scanner fileIn = new Scanner (new File (filename) );

The File class allows access to filesIt’s in the java.io package

filename is a String

Page 25: Iteration

25

Reading a file Class File

Allows access to files (etc.) on a hard drive

Constructor File (String s) Opens the file with name s so that values can be

extracted Name can be either an absolute pathname or a pathname

relative to the current working folder

Page 26: Iteration

26

Reading a file

Scanner stdin = new Scanner (System.in);

System.out.print("Filename: ");String filename = stdin.nextLine();

Scanner fileIn = new Scanner (new File (filename));

String currentLine = fileIn.nextLine();

while (currentLine != null) {System.out.println(currentLine);

currentLine = fileIn.nextLine();}

Scanner stdin = new Scanner (System.in);

System.out.print("Filename: ");String filename = stdin.nextLine();

Scanner fileIn = new Scanner (new File (filename));

String currentLine = fileIn.nextLine();

while (currentLine != null) {System.out.println(currentLine);

currentLine = fileIn.nextLine();}

Set up standard input streamDetermine file nameSet up file streamProcess lines one by oneGet first lineMake sure got a line to processDisplay current lineGet next lineMake sure got a line to processIf not, loop is doneClose the file stream

Page 27: Iteration

2727

Today’s demotivatorsToday’s demotivators

Page 28: Iteration

2929

The For statementThe For statement

Page 29: Iteration

30

The For Statement

currentTerm = 1;

for ( int i = 0; i < 5; ++i ) {System.out.println(currentTerm);currentTerm *= 2;}

After each iteration of thebody of the loop, the updateexpression is reevaluated

The body of the loop iterateswhile the test expression is

trueint

Initialization stepis performed onlyonce -- just prior

to the firstevaluation of thetest expression

The body of the loop displays thecurrent term in the number series.It then determines what is to be thenew current number in the series

Page 30: Iteration

ForExpr

Action

true false

ForInit

ForUpdate

Evaluated onceat the beginning

of the forstatements's

executionThe ForExpr is

evaluated at thestart of each

iteration of theloop

If ForExpr is true,Action isexecuted

After the Actionhas completed,

thePostExpression

is evaluated

If ForExpr isfalse, program

executioncontinues with

next statement

After evaluating thePostExpression, the next

iteration of the loop starts

Page 31: Iteration

32

for statement syntax

Logical test expression that determines whether the action and update step areexecuted

for ( ForInit ; ForExpression ; ForUpdate ) Action

Update step is performed afterthe execution of the loop body

Initialization step prepares for thefirst evaluation of the test

expression

The body of the loop iterates wheneverthe test expression evaluates to true

Page 32: Iteration

33

for vs. while A for statement is almost like a while statement

for ( ForInit; ForExpression; ForUpdate ) Action

is ALMOST the same as:

ForInit;while ( ForExpression ) {

Action;ForUpdate;

}

This is not an absolute equivalence! We’ll see when they are different in a bit

Page 33: Iteration

34

Variable declaration You can declare a variable in any block:

while ( true ) {int n = 0;n++;System.out.println (n);

}System.out.println (n);

Variable n gets created (and initialized) each time

Thus, println() always prints out 1

Variable n is not defined once while

loop ends

As n is not defined here, this causes

an error

Page 34: Iteration

35

Variable declaration You can declare a variable in any block:

if ( true ) {int n = 0;n++;System.out.println (n);

}System.out.println (n);

Only difference from last slide

Page 35: Iteration

36

System.out.println("i is " + i);}

System.out.println("all done");

System.out.println("i is " + i);}

System.out.println("all done");

i is 0i is 1i is 2all done

Execution Tracei 0int i = 0; i < 3; ++ifor ( ) {int i = 0; i < 3; ++i 123

Variable i has gone out of scope – it

is local to the loop

Page 36: Iteration

37

for vs. while An example when a for loop can be directly translated into a while

loop:

int count;for ( count = 0; count < 10; count++ ) {

System.out.println (count);}

Translates to:

int count;count = 0;while (count < 10) {

System.out.println (count);count++;

}

Page 37: Iteration

38

for vs. while An example when a for loop CANNOT be directly translated

into a while loop:

for ( int count = 0; count < 10; count++ ) {System.out.println (count);

}

Would (mostly) translate as:

int count = 0;while (count < 10) {

System.out.println (count);count++;

}count IS defined here

count is NOT defined here

only difference

Page 38: Iteration

39

for loop indexing Java (and C and C++) indexes everything from zero

Thus, a for loop like this:

for ( int i = 0; i < 10; i++ ) { ... }

Will perform the action with i being value 0 through 9, but not 10

To do a for loop from 1 to 10, it would look like this:

for ( int i = 1; i <= 10; i++ ) { ... }

Page 39: Iteration

40

Nested loops

int m = 2;int n = 3;for (int i = 0; i < n; ++i) {

System.out.println("i is " + i);for (int j = 0; j < m; ++j) {

System.out.println(" j is " + j);}

}i is 0 j is 0 j is 1i is 1 j is 0 j is 1i is 2 j is 0 j is 1

Page 40: Iteration

41

Nested loops

int m = 2;int n = 4;for (int i = 0; i < n; ++i) {

System.out.println("i is " + i);for (int j = 0; j < i; ++j) {

System.out.println(" j is " + j);}

}

i is 0i is 1 j is 0i is 2 j is 0 j is 1i is 3

j is 0j is 1j is 2

Page 41: Iteration

42

How well do you understand How well do you understand for loops?for loops?

20% 20% 20%20%20%1.1. Very well! This Very well! This stuff is easy!stuff is easy!

2.2. Fairly well – with Fairly well – with a little review, a little review, I’ll be goodI’ll be good

3.3. Okay. It’s not Okay. It’s not great, but it’s great, but it’s not horrible, not horrible, eithereither

4.4. Not well. I’m Not well. I’m kinda confusedkinda confused

5.5. Not at all. I’m Not at all. I’m soooooo lostsoooooo lost

Page 42: Iteration

4343

From DubaiFrom Dubai

Page 43: Iteration

4444

do-while loopsdo-while loops

Page 44: Iteration

45

The do-while statement Syntax

do Action while (Expression)

Semantics Execute Action If Expression is true then

execute Action again Repeat this process until

Expression evaluates to false

Action is either a single statement or a group of statements within braces

Action

true

false

Expression

Page 45: Iteration

46

Picking off digits Consider

System.out.print("Enter a positive number: ");int number = stdin.nextInt();do { int digit = number % 10; System.out.println(digit); number = number / 10;} while (number != 0);

Sample behaviorEnter a positive number: 11299211

Page 46: Iteration

47

Guessing a number This program will allow the user to guess the number the

computer has “thought” of

Main code block:

do {System.out.print ("Enter your guess:

");guessedNumber = stdin.nextInt();count++;

} while ( guessedNumber != theNumber );

Page 47: Iteration

4848

Program DemoProgram Demo

GuessMyNumber.javaGuessMyNumber.java

Page 48: Iteration

49

while vs. do-while If the condition is false:

while will not execute the action do-while will execute it once

while ( false ) {System.out.println (“foo”);

}

do {System.out.println (“foo”);

} while ( false );

never executed

executed once

Page 49: Iteration

50

while vs. do-while A do-while statement can be translated into a while

statement as follows:

do {Action;

} while ( WhileExpression );

can be translated into:

boolean flag = true;while ( WhileExpression || flag ) {

flag = false;Action;

}

Page 50: Iteration

51

How well do you understand do-How well do you understand do-while loops?while loops?

20% 20% 20%20%20%1.1. Very well! This Very well! This stuff is easy!stuff is easy!

2.2. Fairly well – with Fairly well – with a little review, a little review, I’ll be goodI’ll be good

3.3. Okay. It’s not Okay. It’s not great, but it’s great, but it’s not horrible, not horrible, eithereither

4.4. Not well. I’m Not well. I’m kinda confusedkinda confused

5.5. Not at all. I’m Not at all. I’m soooooo lostsoooooo lost

Page 51: Iteration

5252

Today’s demotivatorsToday’s demotivators

Page 52: Iteration

5454

Loop controlsLoop controls

Page 53: Iteration

55

The continue keyword The continue keyword will immediately start the next iteration of the

loop The rest of the current loop is not executed

But the ForUpdate part is, if continue is in a for loop

for ( int a = 0; a <= 10; a++ ) {if ( a % 2 == 0 ) {

continue;}System.out.println (a + " is odd");

}

Output: 1 is odd3 is odd5 is odd7 is odd9 is odd

Page 54: Iteration

56

The break keyword The break keyword will immediately stop the execution of the loop

Execution resumes after the end of the loop

for ( int a = 0; a <= 10; a++ ) {if ( a == 5 ) {

break;}System.out.println (a + " is less than

five");}

Output: 0 is less than five1 is less than five2 is less than five3 is less than five4 is less than five

Page 55: Iteration

5757

Four HobosFour Hobos

Page 56: Iteration

58

Four Hobos An example of a program that uses nested for loops

Credited to Will Shortz, crossword puzzle editor of the New York Times And NPR’s Sunday Morning Edition puzzle person

Page 57: Iteration

59

Problem Four hobos want to split up 200 hours of work The smart hobo suggests that they draw straws with numbers

on it If a straw has the number 3, then they work for 3 hours on 3

days (a total of 9 hours) The smart hobo manages to draw the shortest straw How many ways are there to split up such work? Which one did the smart hobo choose?

Page 58: Iteration

60

Analysis We are looking for integer solutions to the formula:

a2+b2+c2+d2 = 200 Where a is the number of hours & days the first hobo

worked, b for the second hobo, etc.

We know the following: Each number must be at least 1 No number can be greater than 200 = 14 That order doesn’t matter

The combination (1,2,1,2) is the same as (2,1,2,1) Both combinations have two short and two long

straws

We will implement this with nested for loops

Page 59: Iteration

61

Implementationpublic class FourHobos {

public static void main (String[] args) {for ( int a = 1; a <= 14; a++ ) { for ( int b = 1; b <= 14; b++ ) {

for ( int c = 1; c <= 14; c++ ) { for ( int d = 1; d <= 14; d++ ) {

if ( (a <= b) && (b <= c) && (c <= d) ) { if ( a*a+b*b+c*c+d*d == 200 ) {

System.out.println ("(" + a + ", " + b

+ ", " + c + ", " + d + ")");

}}

}}

}}

}

}

Page 60: Iteration

6262

Program DemoProgram Demo

FourHobos.javaFourHobos.java

Page 61: Iteration

63

Results The output:

(2, 4, 6, 12)(6, 6, 8, 8)

Not surprisingly, the smart hobo picks the short straw of the first combination

Page 62: Iteration

6464

Today’s demotivatorsToday’s demotivators

Page 63: Iteration

65

Alternate implementation We are going to rewrite the old code in the inner most for

loop:

if ( (a <= b) && (b <= c) && (c <= d) ) { if ( a*a+b*b+c*c+d*d == 200 ) {

System.out.println ("(" + a + ", " + b+ ", " + c + ", " + d + ")");

}}

First, consider the negation of ( (a <= b) && (b <= c) && (c <= d) )

It’s ( !(a <= b) || !(b <= c) || !(c <= d) ) Or ( (a > b) || (b > c) || (c > d) )

Page 64: Iteration

66

Alternate implementation This is the new code for the inner-most for loop:

if ( (a > b) || (b > c) || (c > d) ) {continue;

}if ( a*a+b*b+c*c+d*d != 200 ) {

continue;}System.out.println ("(" + a + ", " + b + ", "

+ c + ", " + d + ")");

Page 65: Iteration

67

How well do you understand four How well do you understand four hobos?hobos?

20% 20% 20%20%20%1.1. Very well! This Very well! This stuff is easy!stuff is easy!

2.2. Fairly well – with Fairly well – with a little review, a little review, I’ll be goodI’ll be good

3.3. Okay. It’s not Okay. It’s not great, but it’s great, but it’s not horrible, not horrible, eithereither

4.4. Not well. I’m Not well. I’m kinda confusedkinda confused

5.5. Not at all. I’m Not at all. I’m soooooo lostsoooooo lost

Page 66: Iteration

6868

OrnithologyOrnithology NutritionNutrition PeacePeace

AcousticsAcoustics

MathematicsMathematics

LiteratureLiterature

MedicineMedicine

PhysicsPhysics ChemistryChemistry

BiologyBiology

The 2006 Ig Nobel PrizesThe 2006 Ig Nobel PrizesFor explaining why woodpeckers don’t get headachesFor explaining why woodpeckers don’t get headachesFor showing that Kuwaiti dung beetles are finicky eatersFor showing that Kuwaiti dung beetles are finicky eatersFor development of a high-pitched electronic teen-ager For development of a high-pitched electronic teen-ager

repellent (and, later, ring tones)repellent (and, later, ring tones)For experiments to determine why people don’t like the For experiments to determine why people don’t like the

sound of fingernails scraping on a blackboardsound of fingernails scraping on a blackboardFor calculating the number of photos you must take to For calculating the number of photos you must take to

ensure that (almost) nobody in a group will have their ensure that (almost) nobody in a group will have their eyes closedeyes closed

For a report entitled, “Consequences of Erudite Vernacular For a report entitled, “Consequences of Erudite Vernacular Utilized Irrespective of Necessity: Problems with Using Utilized Irrespective of Necessity: Problems with Using Long Words Needlessly.“Long Words Needlessly.“

For a medical case report titled, “"Termination of Intractable For a medical case report titled, “"Termination of Intractable Hiccups with Digital Rectal Massage“Hiccups with Digital Rectal Massage“

For studying why dry spaghetti breaks into multiple piecesFor studying why dry spaghetti breaks into multiple piecesFor a study entitled, “Ultrasonic Velocity in Cheddar Cheese For a study entitled, “Ultrasonic Velocity in Cheddar Cheese

as Affected by Temperature," as Affected by Temperature," For showing that the female malaria mosquito is equally For showing that the female malaria mosquito is equally

attracted to the smells of limburger cheese and human attracted to the smells of limburger cheese and human feetfeet

Page 67: Iteration

6969

3 card poker3 card poker

Page 68: Iteration

70

3 Card Poker This is the looping HW from a previous fall The problem: count how many of each type of hand in a 3

card poker game

Standard deck of 52 cards (no jokers) Four suits: spades, clubs, diamonds, hearts 13 Faces: Ace, 2 through 10, Jack, Queen, King

Possible 3-card poker hands Pair: two of the cards have the same face value Flush: all the cards have the same suit Straight: the face values of the cards are in succession Three of a kind: all three cards have the same face value Straight flush: both a flush and a straight

Page 69: Iteration

71

The Card class A Card class was provided

Represents a single card in the deck

Constructor: Card(int i) If i is in the inclusive interval 1 ... 52 then a card is

configured in the following manner If 1 <= i <= 13 then the card is a club If 14 <= i <= 26 then the card is a diamond If 27 <= i <= 39 then the card is a heart If 40 <= i <= 52 then the card is a spade If i % 13 is 1 then the card is an Ace; If i % 13 is 2, then the card is a 2, and so on.

Page 70: Iteration

72

Card class methods String getFace()

Returns the face of the card as a String String getSuit()

Returns the suit of the card as a String int getValue()

Returns the value of the card boolean equals(Object c)

Returns whether c is a card that has the same face and suit as the invoking card

String toString() Returns a text representation of the card. You may find

this method useful during debugging.

Page 71: Iteration

73

The Hand class A Hand class was (partially) provided

Represents the three cards the player is holding

Constuctor: Hand(Card c1, Card c2, Card c3) Takes those cards and puts them in sorted order

Page 72: Iteration

74

Provided Hand methods public Card getLow()

Gets the low card in the hand public Card getMiddle()

Gets the middle card in the hand public Card getHigh()

Gets the high card in the hand public String toString()

We’ll see the use of the toString() method later public boolean isValid()

Returns if the hand is a valid hand (no two cards that are the same)

public boolean isNothing() Returns if the hand is not one of the “winning” hands

described before

Page 73: Iteration

75

Hand Methods to Implement The assignment required the students to implement the other

methods of the Hand class We haven’t seen this yet

The methods returned true if the Hand contained a “winning” combination of cards public boolean isPair() public boolean isThree() public boolean isStraight() public boolean isFlush() public boolean isStraightFlush()

Page 74: Iteration

76

Class HandEvaluation Required nested for loops to count the total number of each

hand

Note that the code for this part may not appear on the website

Page 75: Iteration

7777

Program DemoProgram Demo

HandEvaluation.javaHandEvaluation.java

Page 76: Iteration

78

How well do you understand 3-How well do you understand 3-card poker?card poker?

20% 20% 20%20%20%1.1. Very well! This Very well! This stuff is easy!stuff is easy!

2.2. Fairly well – with Fairly well – with a little review, a little review, I’ll be goodI’ll be good

3.3. Okay. It’s not Okay. It’s not great, but it’s great, but it’s not horrible, not horrible, eithereither

4.4. Not well. I’m Not well. I’m kinda confusedkinda confused

5.5. Not at all. I’m Not at all. I’m soooooo lostsoooooo lost

Page 77: Iteration

7979

All your base are belong to All your base are belong to usus

Flash animationFlash animation Reference: http://en.wikipedia.org/wiki/All_your_base_are_belong_to_usReference: http://en.wikipedia.org/wiki/All_your_base_are_belong_to_us

Page 78: Iteration

8181

The Halting ProblemThe Halting Problem

Page 79: Iteration

82

What’s wrong with this program?

public class LoopsForever {public static void main (String args[]) {

while ( true ) {System.out.println ();

}}

}

Given a more complicated program, how do we tell if it gets stuck in an infinite loop? Such as when an application “hangs”?

Page 80: Iteration

83

Page 81: Iteration

84

The Halting problem Given a Java program P, and input I

Let P be a filename for a program file on a disk somewhere

Let I be a filename for a file that contains all the input the program takes in

Will the program P with input I ever terminate? Meaning will program P with input I loop forever or halt?

Can a computer program determine this? Can a human?

First shown by Alan Turing in 1936 Before digital computers existed! (I’m ignoring which way he showed it for now)

Page 82: Iteration

85

A few notes To “solve” the halting problem means we have a method

Oracle.CheckHalt (String P, String I) Let Oracle be a class that can give lots of (truthful)

answers Oracle.PredictFuture(),

Oracle.GetNextLotteryNumbers(), etc. P is the (filename of the) program we are checking for

halting I is the (filename of the) input to that program

And it will return “loops forever” or “halts” As a boolean: true means “loops forever”, false means

“halts” Note it must work for any (Java) program, not just some

programs Or simple programs

Page 83: Iteration

86

Take your best guess – do you Take your best guess – do you think it’s possible to solve the think it’s possible to solve the

halting problem?halting problem?

33% 33%33%1.1. YesYes

2.2. NoNo

3.3. I don’t I don’t understand understand what the what the halting problem halting problem isis

Page 84: Iteration

87

Can a human determine if a program halts?

Given a program of 10 lines or less, can a human determine if it halts? Assuming no tricks – the program is completely

understandable And assuming the computer works properly, of course

And we ignore the fact that an int will max out at 4 billion As there are ways we can get around this…

For the sample programs on the next page: Assume that the code is in a proper main() method in a

proper class Assume “…print” stands for “System.out.print”

Likewise for “…println”

Page 85: Iteration

88

Halting problem examples: will they halt? First sample program:

...println (“Alan Turing”); ...println (“was a genius”); System.exit();

Second sample program:

for (int n = 0; n < 10; n++) ...println (n); System.exit();

Third sample program

while (true) ...println (“hello world”); System.exit();

Fourth sample program:

int x = 10; while ( x > 0 ) { ...println (“hello world”); x = x + 1; } System.exit();

Page 86: Iteration

89

Take your best guess – do you Take your best guess – do you think it’s possible to solve the think it’s possible to solve the

halting problem?halting problem?

33% 33%33%1.1. YesYes

2.2. NoNo

3.3. I don’t I don’t understand understand what the what the halting problem halting problem isis

Page 87: Iteration

90

Perfect numbers Numbers whose divisors (not including the number) add

up to the number 6 = 1 + 2 + 3 28 = 1 + 2 + 4 + 7 + 14

The list of the first 10 perfect numbers:6, 28, 496, 8128, 33550336, 8589869056, 137438691328, 2305843008139952128, 2658455991569831744654692615953842176, 191561942608236107294793378084303638130997321548169216 The last one was 54 digits!

All known perfect numbers are even; it’s an open (i.e. unsolved) problem if odd perfect numbers exist

Sequence A000396 in OEIS

Page 88: Iteration

91

Odd perfect number search Will this program ever halt?

int n = 1; // arbitrary-precision integer while (true) { int sumOfFactors = 0; for ( int factor = 1; factor < n; factor++ ) if ( n % factor == 0 ) // factor is a factor of n sumOfFactors = sumOfFactors + factor; if (sumOfFactors == n) then break; n = n + 2; } System.out.exit();

Adapted from http://en.wikipedia.org/wiki/Halting_problem

Page 89: Iteration

92

Take your best guess – do you Take your best guess – do you think it’s possible to solve the think it’s possible to solve the

halting problem?halting problem?

33% 33%33%1.1. YesYes

2.2. NoNo

3.3. I don’t I don’t understand understand what the what the halting problem halting problem isis

Page 90: Iteration

93

Where does that leave us?

If a human can’t figure out how to do the halting problem, we can’t make a computer do it for us

It turns out that it is impossible to write such a CheckHalt() method But how to prove this?

Page 91: Iteration

94

CheckHalt()’s non-existence Consider a program P with input I Suppose that a method Oracle.CheckHalt(P,I) exists

Tests if P(I) will either “loop forever” or “halt” A program is a series of bits

And thus can be considered data as well Thus, we can call CheckHalt(P,P)

It’s using the bytes of program P as the input to program P

Page 92: Iteration

95

CheckHalt()’s non-existence Consider a new program:

public class Test {public static void main (String args[]) {

if ( Oracle.CheckHalt(“Test.java”, “Test.java”) )// if Test.java loops

foreverSystem.exit(); // then halt

else // else if Test.java haltswhile (true) { } // then loop forever

}}

Do we agree that class Test is a valid program?

Page 93: Iteration

96

CheckHalt()’s non-existence A (somewhat condensed)

version of class Test:

public class Test {… main … (String args[]) {

if ( Oracle.CheckHalt (“Test.java”,

“Test.java”) )

System.exit(); elsewhile (true) { } }

}

Two possibilities:

Either class Test halts… Then CheckHalt(Test,Test)

returns true (“loops forever”)…

Which means that class Test loops forever

Contradiction!

Or class Test loops forever… Then CheckHalt(Test,Test)

returns false (“halts”)… Which means that class

Test halts Contradiction!

Page 94: Iteration

97

How well do you understand How well do you understand the halting problem?the halting problem?

20% 20% 20%20%20%1.1. Very well! This Very well! This stuff is easy!stuff is easy!

2.2. Fairly well – with Fairly well – with a little review, a little review, I’ll be goodI’ll be good

3.3. Okay. It’s not Okay. It’s not great, but it’s great, but it’s not horrible, not horrible, eithereither

4.4. Not well. I’m Not well. I’m kinda confusedkinda confused

5.5. Not at all. I’m Not at all. I’m soooooo lostsoooooo lost

Page 95: Iteration

98

Why do we care about the halting problem?

It was the first algorithm that was shown to not be able to exist by a computer You can prove something exists by showing an example (a

correct program) But it’s much harder to prove that a program can never

exist

First shown by Alan Turing in 1936 Before digital computers existed!

Page 96: Iteration

9999

New 2005 demotivatiors!New 2005 demotivatiors!

Page 97: Iteration

100100

Not going over any more Not going over any more slides in this slide setslides in this slide set

Page 98: Iteration

101101

Triangle countingTriangle counting

Page 99: Iteration

102

The programming assignment This was the looping HW from two springs ago

List all the possible triangles from (1,1,1) to (n,n,n) Where n is an inputted number In particular, list their triangle type

Types are: equilateral, isosceles, right, and scalene

Page 100: Iteration

103

Sample execution

Enter n: 5

(1,1,1) isosceles equilateral(1,2,2) isosceles(1,3,3) isosceles(1,4,4) isosceles(1,5,5) isosceles(2,2,2) isosceles equilateral(2,2,3) isosceles(2,3,3) isosceles(2,3,4) scalene(2,4,4) isosceles(2,4,5) scalene

(2,5,5) isosceles(3,3,3) isosceles equilateral(3,3,4) isosceles(3,3,5) isosceles(3,4,4) isosceles(3,4,5) right scalene(3,5,5) isosceles(4,4,4) isosceles equilateral(4,4,5) isosceles(4,5,5) isosceles(5,5,5) isosceles equilateral

Page 101: Iteration

104104

Program DemoProgram Demo

TriangleDemo.javaTriangleDemo.java

Page 102: Iteration

105

The Triangle class That semester we went over classes by this homework

So they had to finish the class We will be seeing class creation after spring break

Methods in the class: public Triangle() public Triangle (int x, int y, int z) public boolean isTriangle() public boolean isRight() public boolean isIsosceles() public boolean isScalene() public boolean isEquilateral() public String toString()

Page 103: Iteration

106

The TriangleDemo class Contained a main() method that tested all the triangles

Steps required: Check if the sides are in sorted order (i.e. x < y < z)

If not, then no output should be provided for that collection of side lengths

Create a new Triangle object using the current side lengths Check if it is a valid triangle

If it is not, then no output should be provided for that collection of side lengths

Otherwise, indicate which properties the triangle possesses Some side length values will correspond to more than 1

triangle e.g., (3, 3, 3) is both isosceles and equilateral Thus, we can’t assume that once a property is present, the

others are not.

Page 104: Iteration

107107

Look at that them there code…Look at that them there code…

TriangleDemo.javaTriangleDemo.java

Page 105: Iteration

108

How well do you understand How well do you understand triangle counting?triangle counting?

20% 20% 20%20%20%1.1. Very well! This Very well! This stuff is easy!stuff is easy!

2.2. Fairly well – with Fairly well – with a little review, a little review, I’ll be goodI’ll be good

3.3. Okay. It’s not Okay. It’s not great, but it’s great, but it’s not horrible, not horrible, eithereither

4.4. Not well. I’m Not well. I’m kinda confusedkinda confused

5.5. Not at all. I’m Not at all. I’m soooooo lostsoooooo lost

Page 106: Iteration

109109

Fibonacci numbersFibonacci numbers

Page 107: Iteration

110

Fibonacci sequence Sequences can be neither geometric or arithmetic

Fn = Fn-1 + Fn-2, where the first two terms are 1 Alternative, F(n) = F(n-1) + F(n-2)

Each term is the sum of the previous two terms Sequence: { 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, … } This is the Fibonacci sequence

Full formula:

n

nn

nF25

5151)(

Page 108: Iteration

111

Fibonacci sequence in nature

1385321

Page 109: Iteration

112

Reproducing rabbits You have one pair of rabbits on an island

The rabbits repeat the following: Get pregnant one month Give birth (to another pair) the next month

This process repeats indefinitely (no deaths) Rabbits get pregnant the month they are born

How many rabbits are there after 10 months?

Page 110: Iteration

113

Reproducing rabbits First month: 1 pair

The original pair Second month: 1 pair

The original (and now pregnant) pair Third month: 2 pairs

The child pair (which is pregnant) and the parent pair (recovering)

Fourth month: 3 pairs “Grandchildren”: Children from the baby pair (now

pregnant) Child pair (recovering) Parent pair (pregnant)

Fifth month: 5 pairs Both the grandchildren and the parents reproduced 3 pairs are pregnant (child and the two new born rabbits)

Page 111: Iteration

114

Reproducing rabbits Sixth month: 8 pairs

All 3 new rabbit pairs are pregnant, as well as those not pregnant in the last month (2)

Seventh month: 13 pairs All 5 new rabbit pairs are pregnant, as well as those not

pregnant in the last month (3) Eighth month: 21 pairs

All 8 new rabbit pairs are pregnant, as well as those not pregnant in the last month (5)

Ninth month: 34 pairs All 13 new rabbit pairs are pregnant, as well as those not

pregnant in the last month (8) Tenth month: 55 pairs

All 21 new rabbit pairs are pregnant, as well as those not pregnant in the last month (13)

Page 112: Iteration

115

Reproducing rabbits Note the sequence:

{ 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, … }

The Fibonacci sequence again

Page 113: Iteration

116

Fibonacci sequence Another application:

Fibonacci references from http://en.wikipedia.org/wiki/Fibonacci_sequence

Page 114: Iteration

117

Fibonacci sequence As the terms increase, the ratio between successive terms

approaches 1.618

This is called the “golden ratio” Ratio of human leg length to arm length Ratio of successive layers in a conch shell

Reference: http://en.wikipedia.org/wiki/Golden_ratio

618933989.12

15

)(

)1(lim

nF

nFn

Page 115: Iteration

118

The Golden Ratio

Page 116: Iteration

119

Page 117: Iteration

120120

Number countingNumber counting

Page 118: Iteration

121

The programming assignment This was the looping HW from last fall

Get an integer i from the user The homework had four parts

Print all the Fibonacci numbers up to i Print all the powers of 2 up to i Print all the prime numbers up to i Time the previous three parts of the code

Page 119: Iteration

122

Sample executionInput an integer i: 10

The 10th Fibonacci number is 55Computation took 1 ms

2 3 5 7 11 13 17 19 23 29The 10th prime is 29Computation took 0 ms

The 10th power of 2 is 1024Computation took 6 ms

2 4 8 16 32 64 128 256 512 1024BigInteger: The 10th power of 2 is 1024Computation took 2 ms

Page 120: Iteration

123

Background: Prime numbers Remember that a prime number is a number that is ONLY

divisible by itself and 1

Note that 1 is not a prime number! Thus, 2 is the first prime number

The first 10 prime numbers: 2 3 5 7 11 13 17 19 23 29

The easiest way to determine prime numbers is with nested loops

Page 121: Iteration

124

How to time your code Is actually pretty easy:

long start = System.currentTimeMillis();// do the computationlong stop = System.currentTimeMillis();long timeTakenMS = stop-start;

This is in milliseconds, so to do the number of actual seconds:

double timeTakenSec = timeTakenMS / 1000.0;

Page 122: Iteration

125125

Program DemoProgram Demo

NumberGames.javaNumberGames.java

Note what happens when you enter 100Note what happens when you enter 100 With the Fibonacci numbersWith the Fibonacci numbers With the powers of 2With the powers of 2

Page 123: Iteration

126

BigIntegers An int can only go up to 2^31 or about 2*109

A long can only go up to 2^63, or about 9*1018

What if we want to go higher?

2100 = 1267650600228229401496703205376

To do this, we can use the BigInteger class It can represent integers of any size

This is called “arbitrary precision” Not surprisingly, it’s much slower than using ints and

longs

The Fibonacci number part didn’t use BigIntegers That’s why we got -980107325 for the 100th term It “flowed over” the limit for ints – called “overflow”

Page 124: Iteration

127

BigInteger usage BigIntegers are in the java.math library

import java.math.*;

To get nn:

BigInteger bigN = new BigInteger (String.valueOf(n));BigInteger biggie = new BigInteger

(String.valueOf(1));for ( int i = 0; i < n; i++ )

biggie = biggie.multiply (bigN);System.out.println (biggie);

Page 125: Iteration

128128

Look at that them there code…Look at that them there code…

NumberGames.javaNumberGames.java


Recommended