my slides - WordPress.com
Download
Report
Transcript my slides - WordPress.com
Recursion in Java
The answer to life’s greatest
mysteries are on the last slide
Recursion
Recursion is a technique widely used in
programming
In fact some programming languages
have no loops, only recursion
Recursion is a key element to advanced
studies such as computational
intelligence
Beginning programmers usually groan at
recursion… real programmers love it!
Recursion in Java
A method is recursive if it calls itself.
There are two key things in recursion
Base step: ends the recursion
Recursive step: breaks down the problem to
smaller sub problems
Before you code anything, you need to
find those two steps… otherwise you
may not understand the problem properly
Example
Here is a simple recursive java function
for called countdown:
public void countDown( int value )
{
if( value == 0 )
System.out.println( “Blast Off!!!” );//base case, no recursion
else
{
System.out.println( value );
countDown( value – 1);//recursive call of small problem
}
}
LETS TRACE countDown( 5 ) BY HAND
Why Recursion?
Fact: All recursion can be re written as a
non recursive form with a loop
Some algorithms are exceedingly
complex as a loop, yet very elegant in a
recursive form.
Easier to understand less “bugs” = better
programs
Let’s take a look at Paint for a minute…
The Flood Fill Algorithm
The recursion is tricky to follow, but look at how simple
the code is!
public void floodFill( int x, int y, Colour clicked, Colour change )
{
if( outOfBounds(x,y) || getColour(x,y) == change || getColour(x,y) != clicked )
return;//nothing to do – base case
setColour(x,y,change);//colour is the same as was clicked, change it
//Recursive call on neighbours
floodFill( x + 1, y, clicked, colour );
floodFill( x, y + 1, clicked, colour );
floodFill( x - 1, y, clicked, colour );
floodFill( x, y - 1, clicked, colour );
}
Getting the hang of it?
Let’s try a couple together
Base step
Recursive step
Sum of n numbers
Ex. 1 + 2 + 3 + 4 + 5 = 15
Factorials
0! = 1
3! = 3 x 2 x 1 = 3 x 2!
100! = 100x99x98x..x3x2x1 = 100 x 99!
Still Need Practice?
Here are two other famous recursive examples:
Fibonacci numbers
1st number is 1, 2nd number is 1
Every number after 2 is the sum of the previous two:
1,1,2,3,5,8,13,…
Euclid’s GCF (from ~300BC)
http://en.wikipedia.org/wiki/Euclidean_algorithm
Take the larger of the two and divide it by the smaller
If the remainder is zero, return the smaller number
Otherwise take the GCF of smaller and remainder
Example let’s try 60 and 105
Pascal’s Triangle
1
1
1
1
1
1
2
3
4
1
3
6
…
1
4
1
Pascal’s Triangle Cont’
What’s the recursive pattern in Pascal’s
triangle?
Hint: Number each row and column
What is/are the base case(s)?
What is the recursive case?
Performance: Loops vs.
Recursion
Why not always use recursion if it makes our code
easier to understand?
The key reason is performance
Recursion can quickly overflow the computer’s memory
Each method call has its own “stack” in memory when
it is called (holds variables, loops, etc.)
When you make a recursive call, another copy of the
method is stored in memory to preserve the state when
it returns.
With loops, the variables are reused
Last I had heard, Sun’s java compiler will translate tail
recursion into a loop for you
Tail recursion means the recursive call is the last piece of code
in the method (nothing is computed after it returns)
Recursion in Memory
Consider a call to factorial( 3 ):
factorial(3) 3 * factorial(2)
2 * factorial(1)
1 * factorial(0)
1
Recursion ends, return to last caller:
1*1=1
2*1=2
3*2=6
Recursion in Memory
With a loop it would look like this:
public int factorial( int n )
{
int fac = 1;
for( int counter = 2; counter <= n; counter++ )
fac *= counter;
return fac;
}
A call to factorial( 3 ) is now just:
1*2*3=6
The H-Fractal
I’ll code a fractal with you so you can see
just how powerful recursion is for
problem solving
It would probably take me all day to code
this with a loop
I can do it with recursion in about 5 minutes
Exercises
Create a recursive method to calculate
the sum of squares:
For example, sumSquares( 3 )
Is 1 + 4 + 9 = 14
Exercises
Create a recursive method to calculate
positive integer exponents
Ex.
findExponent( 3, 2 )
Returns 9
Exercises
Create a recursive method to determine if
the values in an array are increasing
You need an extra parameter telling you
which index to start testing from
isIncr( int[] data, int start )
isIncr( {1,3,5,9},0 ) returns true
isIncr( {3,1,2,4},0 ) returns false
Exercises
Create a recursive method to sum the
values in an array:
sum( int[] data, int start )
sum( {4,2,5}, 0 )
Returns 11
Exercises
Create a recursive method called reverse
that reverses the elements in an array
Reverse( int[] data )
Reverse( {1,3,5,2,7 } )
{7,2,5,3,1}
Exercises – Reverse Cont’
Sometimes when we are using recursion, we
will write a helper method to hold more
parameters.
In the previous example to reverse an array
you should write a helper method called:
ReverseHelper( int[] data, int start, int end )
When you call Reverse( int[] data ) use the
helper method as follows (it does all the work)
ReverseHelper( data, 0, data.length)
Exercises
Create a recursive method to determine
whether or not a word is a palindrome or
not.
A palindrome is a word spelled the same
forwards and backwards
For example Ogopogo
public boolean isPalidrome(String word)
Exercises
To convert an integer to base 2 (binary)
here is an algorithm:
public String toBinary( int n )
If the number is zero, return 0
Otherwise,
Compute the quotient and remainder when
dividing by 2
The binary value of the number given is the
binary value of the quotient followed by the
remainder
Binary Numbers
Ex.
Binary value of 13:
Calculation Quotient
13/2
6
6/2
3
3/2
1
1/2
0
0
13 = 01101 in binary
Remainder
1
0
1
1
return 0
Bonus Graphics - Fractals
Three fractals which can be created using
recursion are:
Sierpinski’s Gasket
Koch’s Snowflake
Dragon Fractal
Create a recursive graphics program to display
any of these fractals at a given level
Demo will be done in class for each fractal and
how they can be obtained
Life’s Greatest Mysteries
Revealed!
The answer to life’s greatest mysteries
are on the first slide