Title: Welcome to CIS 068 !
1Welcome to CIS 068 !
Stacks and Recursion
2Overview
- Subjects
- Stacks
- Structure
- Methods
- Stacks and Method Calls
- Recursion
- Principle
- Recursion and Stacks
- Recursion vs. Iteration
- Examples
3Stacks Introduction
- What do these tools have in common ?
Plate Dispenser
PEZ Dispenser
4Stack Properties
- Answer
- They both provide LIFO (last in first out)
Structures
6
6
5
5
4
4
3
3
2
2
1
1
5Stacks Properties
- Possible actions
- PUSH an object (e.g. a plate) onto dispenser
- POP object out of dispenser
6Stacks Definition
- Stacks 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
7Stacks
- Application 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
8Stacks
- Q
- How would you implement a Stack ?
9A look into the JVM
- Sample 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
10A 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
11A look into the JVM
- 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
c 15
b 5
a 3
Return to LINE 3
b
a 3
12A look into the JVM
Temporary storage
15
Return to LINE 3
Return to LINE 3
c 15
b 5
a 3
Return to LINE 3
c 15
Clear Stack
b
b
b
a 3
a 3
a 3
13A look into the JVM
A look into the JVM
1 public static void main(String args
) 2 int a 3 3 int b timesFive(a) 4 Syst
em.out.println(b) 5
c 15
b
b 15
a 3
a 3
Temporary storage
14A look into the JVM
A look into the JVM
1 public static void main(String args
) 2 int a 3 3 int b timesFive(a) 4 Syst
em.out.println(b) 5
clear stack from local variables
15A look into the JVM
A look into the JVM
Important 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
16Applications using a Stack
- Examples
- Finding Palindromes
- Bracket Parsing
- RPN
- RECURSION !
17Recursion
Recursion
18Recursion
Recursion
- 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
19Recursion
Recursion
When you turn that into a program, you end up
with functions that call themselves Recursive
Functions
20Recursion
Recursion
Whats behind this function ?
public int f(int a) if (a1)
return(1) else return(a f( a-1))
It computes f! (factorial)
21Factorial
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)!
22Tracing the example
public int factorial(int a) if (a0)
return(1) else return(a factorial(
a-1))
RECURSION !
23Watching the Stack
public int factorial(int a) if (a1)
return(1) else return(a factorial(
a-1))
a 1
Return to L4
a 2
Return to L4
a 3
Return to L4
a 4
a 4
Return to L4
Return to L4
a 5
a 5
a 5
Initial
After 1 recursion
After 4th recursion
Every call to the method creates a new set of
local variables !
24Watching the Stack
public int factorial(int a) if (a1)
return(1) else return(a factorial(
a-1))
a 1
Return to L4
a 2
a 21 2
Return to L4
Return to L4
a 3
a 3
a 32 6
Return to L4
Return to L4
Return to L4
a 4
a 4
a 4
a 46 24
Return to L4
Return to L4
Return to L4
Return to L4
a 5
a 5
a 5
a 5
a 524 120
After 4th recursion
Result
25Properties of Recursive Functions
- 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
26Solution
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 on stack
Solution on stack
Solution on stack
27Common Programming Error
Recursion does not terminate properly Stack
Overflow !
28Exercise
Define a recursive solution for the following
function f(x) x
n
29Recursion vs. Iteration
You could have written the power-function
iteratively, i.e. using a loop construction Where
s the difference ?
30Recursion vs. Iteration
- 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
31Deciding 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
32Examples Fractal Tree
http//id.mind.net/zona/mmts/geometrySection/frac
tals/tree/treeFractal.html
33Examples The 8 Queens Problem
http//mossie.cs.und.ac.za/murrellh/javademos/que
ens/queens.html
Eight queens are to be placed on a chess board
in such a way that no queen checks against any
other queen
34Review
- 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