Download - CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

Transcript
Page 1: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

Welcome to CIS 068 !

Stacks and Recursion

Page 2: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

Overview

Subjects:

• Stacks– Structure

– Methods

– Stacks and Method – Calls

• Recursion– Principle

– Recursion and Stacks

– Recursion vs. Iteration

– Examples

Page 3: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

Stacks: IntroductionWhat do these tools have in common ?

Plate Dispenser

PEZ ® Dispenser

Page 4: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

Stack: PropertiesAnswer:

They both provide LIFO (last in first out) Structures

12345

6

123456

Page 5: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

Stacks: PropertiesPossible actions:

• PUSH an object (e.g. a plate) onto dispenser

• POP object out of dispenser

Page 6: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

Stacks: DefinitionStacks are LIFO structures, providing

• Add Item (=PUSH) Methods

• Remove Item (=POP) Methods

They are a simple way to build a collection

• No indexing necessary

• Size of collection must not be predefined

• But: extremely reduced accessibility

Page 7: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

StacksApplication Areas

• LIFO order is desired

– See JVM-example on next slides

• ...or simply no order is necessary

– Lab-assignment 5: reading a collection of coordinates to draw

Page 8: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

Stacks

Q:

How would you implement a Stack ?

Page 9: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

A look into the JVMSample Code:1 public static void main(String args[ ]){

2 int a = 3;

3 int b = timesFive(a);

4 System.out.println(b+““);

5 }

6 Public int timesFive(int a){

7 int b = 5;

8 int c = a * b;

9 return (c);

10 }

Page 10: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

A look into the JVM

Inside the JVM a stack is used to

• create the local variables

• to store the return address from a call

• to pass the method-parameters

Page 11: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

A look into the JVM1 public static void main(String args[ ]){

2 int a = 3;

3 int b = timesFive(a);

4 System.out.println(b+““);

5 }

6 Public int timesFive(int a){

7 int b = 5;

8 int c = a * b;

9 return (c);

10 }a = 3

a = 3

b

Return to LINE 3

b = 5

c = 15

Page 12: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

A look into the JVM...

9 return (c);

10 ...

a = 3

a = 3

b

Return to LINE 3

b = 5

c = 15

15

a = 3

b

Return to LINE 3

a = 3

b

c = 15

Return to LINE 3

Temporary storage

Clear Stack

Page 13: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

A look into the JVMA look into the JVM1 public static void main(String args[ ]){

2 int a = 3;

3 int b = timesFive(a);

4 System.out.println(b+““);

5 }

a = 3

b

c = 15

Temporary storage

a = 3

b = 15

Page 14: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

A look into the JVMA look into the JVM1 public static void main(String args[ ]){

2 int a = 3;

3 int b = timesFive(a);

4 System.out.println(b+““);

5 }

clear stack from local variables

Page 15: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

A look into the JVMA look into the JVMImportant:

Every call to a method creates a new set of local variables !

These Variables are created on the stack and deleted when the method returns

Page 16: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

Applications using a Stack

Examples:

• Finding Palindromes

• Bracket Parsing

• RPN

• RECURSION !

Page 17: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

RecursionRecursion

Page 18: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

RecursionRecursion

• Sometimes, the best way to solve a problem is by solving a smaller version of the exact same problem first

• Recursion is a technique that solves a problem by solving a smaller problem of the same type

• A procedure that is defined in terms of itself

Page 19: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

RecursionRecursion

When you turn that into a program, you end up with functions that call themselves:

Recursive Functions

Page 20: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

RecursionRecursion

public int f(int a){if (a==1) return(1);else return(a *

f( a-1));}

It computes f! (factorial)

What’s behind this function ?

Page 21: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

Factorial:

a! = 1 * 2 * 3 * ... * (a-1) * a

Note:

a! = a * (a-1)!

remember:

...splitting up the problem into a smaller problem of the same type...

a!

a * (a-1)!

Factorial

Page 22: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

public int factorial(int a){if (a==0) return(1);else return(a * factorial( a-1));

}

Tracing the example

RECURSION !

Page 23: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

public int factorial(int a){if (a==1) return(1);else return(a * factorial( a-1));

}

Watching the Stack

a = 5 a = 5 a = 5Return to L4

a = 4Return to L4

a = 4Return to L4

a = 3Return to L4

a = 2Return to L4

a = 1

Initial After 1 recursion After 4th recursion

Every call to the method creates a new set of local variables !

Page 24: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

public int factorial(int a){if (a==1) return(1);else return(a * factorial( a-1));

}

Watching the Stack

a = 5Return to L4

a = 4Return to L4

a = 3Return to L4

a = 2Return to L4

a = 1

After 4th recursion

a = 5Return to L4

a = 4Return to L4

a = 3Return to L4a = 2*1 = 2

a = 5Return to L4

a = 4Return to L4a = 3*2 = 6

a = 5Return to L4a = 4*6 = 24

a = 5*24 = 120

Result

Page 25: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

Problems that can be solved by recursion have these characteristics:

• One or more stopping cases have a simple, nonrecursive solution

• The other cases of the problem can be reduced (using recursion) to problems that are closer to stopping cases

• Eventually the problem can be reduced to only stopping cases, which are relatively easy to solve

Follow these steps to solve a recursive problem:

• Try to express the problem as a simpler version of itself

• Determine the stopping cases

• Determine the recursive steps

Properties of Recursive Functions

Page 26: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

The recursive algorithms we write generally consist of an if statement:

IF

the stopping case is reached solve it

ELSE

split the problem into simpler cases using recursion

Solution

Solution on stackSolution on stack

Solution on stack

Page 27: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

Recursion does not terminate properly: Stack Overflow !

Common Programming Error

Page 28: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

Define a recursive solution for the following function:

f(x) = x

Exercise

n

Page 29: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

Recursion vs. Iteration

You could have written the power-function iteratively, i.e. using a loop construction

Where‘s the difference ?

Page 30: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

• Iteration can be used in place of recursion– An iterative algorithm uses a looping

construct– A recursive algorithm uses a branching

structure

• Recursive solutions are often less efficient, in terms of both time and space, than iterative solutions

• Recursion can simplify the solution of a problem, often resulting in shorter, more easily understood source code

• (Nearly) every recursively defined problem can be solved iteratively iterative optimization can be implemented after recursive design

Recursion vs. Iteration

Page 31: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

Deciding whether to use a Recursive Function

• When the depth of recursive calls is relatively “shallow”

• The recursive version does about the same amount of work as the nonrecursive version

• The recursive version is shorter and simpler than the nonrecursive solution

Page 32: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

Examples: Fractal Tree

http://id.mind.net/~zona/mmts/geometrySection/fractals/tree/treeFractal.html

Page 33: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

Examples: The 8 Queens Problem

http://mossie.cs.und.ac.za/~murrellh/javademos/queens/queens.html

Eight queens are to be placed on a chess board

in such a way that no queen checks against

any other queen

Page 34: CIS 068 Welcome to CIS 068 ! Stacks and Recursion.

CIS 068

Review

• A stack is a simple LIFO datastructure used e.g. by the JVM to create local variable spaces

• Recursion is a divide and conquer designing technique that often provides a simple algorithmic structure

• Recursion can be replaced by iteration for reasons of efficiency

• There is a connection between recursion and the use of stacks

• There are interesting problems out there that can be solved by recursion