Recursion
Method Calling Itself
Unit 10
1
1
TClark
No Transitions
TClark
TClark
Activity with
Recursive
Directions
2
2
TClark
TClark
TClark
Activity - Sierpinski's Triangle
TClark
TClark
Activity - Sierpinski's Triangle (TClark ver)
TClark
TClark
Recursion
Definition
5
5
TClark
TClark
TClark
Recursion is a technique where one method will call itself, usually with a parameter that is a smaller data set.
Recursion is used to break a complex problem into a simpler problem of the same type which eventually leads to the ending condition.
Two parts:
Recursion
TClark
TClark
Two parts:
Recursion Two Parts
TClark
TClark
Return the answer for the known case.
if(base_case_condition)�{� return known_solution;�}
Base Case
TClark
TClark
Return a call to the same method with a smaller data set, in an equation
The smaller data set should trend/go towards the base case.
else �{� return n ~math~ sameMethod(n-1);�}
Assume that the recursive call works correctly, i.e. sameMethod(n-1) will return the correct value of whatever it should be.
~math~ depends on the problem
Pattern
TClark
TClark
if(base_case_condition)�{� return known_solution;�}�else �{� return n ~math~ sameMethod(n-1);�}
Full Example
TClark
TClark
When creating or working with recursive functions, keep in mind these two questions:
Two Questions
TClark
TClark
Sierpinski's Triangle
Example
12
12
TClark
TClark
TClark
Sierpinski's Triangle Questions
TClark
TClark
Sierpinski's Triangle: recursive directions
TClark
TClark
Factorial
Example n!
15
15
TClark
TClark
TClark
Factorial Questions n!
TClark
TClark
public int factorial(int n)
{
if(n == 0)
{
return 1;
}
else
{
return n * factorial(n-1);
}
}
Factorial Method
TClark
TClark
Identify Parts
Practice
18
18
TClark
TClark
TClark
Product - Two Parts
TClark
input less than or equal to 1 → return 1
multiply input to the product call with next smaller integer: n * product(n-1)
TClark
Mystery1 - Two Parts
TClark
The else to the if statement:
if x / 10 != 0
it will only call the recursion if the conditional is true
TClark
Mystery2 - Two Parts
TClark
input is zero → return 1
multiply three times the mystery2 call with next smaller integer
TClark
Mystery3 - Two Parts
TClark
input is zero → return 1
multiply five times the mystery3 call with next smaller integer and subtract that from two
TClark
Fibonacci - Two Parts
TClark
input is 0 → return 0
input is 1 → return 1
add finacci call with next smaller integer to the fibonacci call with integer two smaller
TClark
Factorial
Tracing
24
24
TClark
TClark
TClark
public int factorial(int n)
{
if(n == 0)
{
return 1;
}
else
{
return n * factorial(n-1);
}
}
Factorial (product) Method
TClark
TClark
5!
5 * 4!
4 * 3!
3 * 2!
2 * 1!
1 * 0!
1 ← base case: 0! is 1
factorial(5)
TClark
TClark
5!
5 * 4!
4 * 3!
3 * 2!
2 * 1!
1 * 1
factorial(5)
TClark
TClark
5!
5 * 4!
4 * 3!
3 * 2!
2 * 1!
1
factorial(5)
TClark
TClark
5!
5 * 4!
4 * 3!
3 * 2!
2 * 1
factorial(5)
TClark
TClark
5!
5 * 4!
4 * 3!
3 * 2!
2
factorial(5)
TClark
TClark
5!
5 * 4!
4 * 3!
3 * 2
factorial(5)
TClark
TClark
5!
5 * 4!
4 * 3!
6
factorial(5)
TClark
TClark
5!
5 * 4!
4 * 6
factorial(5)
TClark
TClark
5!
5 * 4!
24
factorial(5)
TClark
TClark
5!
5 * 24
factorial(5)
TClark
TClark
5!
120
factorial(5)
TClark
TClark
120
factorial(5)
TClark
TClark
120
factorial(5)
TClark
TClark
Reverse String
Example
39
39
TClark
TClark
TClark
Reverse String Questions
TClark
TClark
public String reverse(String str)
{
if(str.length() == 0)
{
return "";
}
return str.substring(str.length()-1) +
reverse( str.substring(0, str.length()-1) );
}
Reverse Method
TClark
TClark
reverse("clark")
k + reverse("clar")
r + reverse("cla")
a + reverse("cl")
l + reverse("c")
c + reverse("")
"" ← base case
reverse("clark")
TClark
TClark
reverse("clark")
k + reverse("clar")
r + reverse("cla")
a + reverse("cl")
l + reverse("c")
c + ""
reverse("clark")
TClark
TClark
reverse("clark")
k + reverse("clar")
r + reverse("cla")
a + reverse("cl")
l + reverse("c")
c
reverse("clark")
TClark
TClark
reverse("clark")
k + reverse("clar")
r + reverse("cla")
a + reverse("cl")
l + c
reverse("clark")
TClark
TClark
reverse("clark")
k + reverse("clar")
r + reverse("cla")
a + reverse("cl")
lc
reverse("clark")
TClark
TClark
reverse("clark")
k + reverse("clar")
r + reverse("cla")
a + lc
reverse("clark")
TClark
TClark
reverse("clark")
k + reverse("clar")
r + reverse("cla")
alc
reverse("clark")
TClark
TClark
reverse("clark")
k + reverse("clar")
r + alc
reverse("clark")
TClark
TClark
reverse("clark")
k + reverse("clar")
ralc
reverse("clark")
TClark
TClark
reverse("clark")
k + ralc
reverse("clark")
TClark
TClark
reverse("clark")
kralc
reverse("clark")
TClark
TClark
kralc
reverse("clark")
TClark
TClark
kralc
reverse("clark")
TClark
TClark
Base Condition
MUST WORK
55
55
TClark
TClark
TClark
If the base condition is not reached, i.e. the smaller data set skips it, then it could result in an infinite recursion error which will crash the program: � stack overflow
Base Condition MUST WORK
TClark
TClark
public int mystery(int n)
{
if(n == 0)
{
return 10;
}
else
{
return n + mystery(n-2);
}
}
What happens if you call: mystery(5)?
Recursion Problem → stack overflow
TClark
TClark
mystery(5)
5 + mystery(3)
3 + mystery(1)
1 + mystery(-1)
-1 + mystery(-3)
-3 + mystery(-5)
-5 + mystery(-7)
-7 + mystery
pattern skips 0 &�keeps going on�forever until the�computer crashes
mystery(5)
TClark
TClark
Recursive Practice:
M1 Call Stack
59
59
TClark
TClark
TClark
Mystery1 - Call Stack
TClark
TClark
Mystery1 - Two Parts
TClark
The else to the if statement:
if x / 10 != 0
it will only call the recursion if the conditional is true
TClark
mystery1(54321)
1…mystery1(5432) …
12…mystery1(543) …
123…mystery1(54) …
1234…mystery1(5) …
12345… BASE CASE …
now do second part
TClark
Mystery1 - Call Stack
TClark
mystery1(54321)
1…mystery1(5432) …
12…mystery1(543) …
123…mystery1(54) …
1234…mystery1(5) …
12345 …5
TClark
Mystery1 - Call Stack
TClark
mystery1(54321)
1…mystery1(5432) …
12…mystery1(543) …
123…mystery1(54) …
1234…mystery1(5) …
123455
TClark
Mystery1 - Call Stack
TClark
mystery1(54321)
1…mystery1(5432) …
12…mystery1(543) …
123…mystery1(54) …
123455 …4
TClark
Mystery1 - Call Stack
TClark
mystery1(54321)
1…mystery1(5432) …
12…mystery1(543) …
123…mystery1(54) …
1234554
TClark
Mystery1 - Call Stack
TClark
mystery1(54321)
1…mystery1(5432) …
12…mystery1(543) …
1234554 …3
TClark
Mystery1 - Call Stack
TClark
mystery1(54321)
1…mystery1(5432) …
12…mystery1(543) …
12345543
TClark
Mystery1 - Call Stack
TClark
mystery1(54321)
1…mystery1(5432) …
12345543 …2
TClark
Mystery1 - Call Stack
TClark
mystery1(54321)
1…mystery1(5432) …
123455432
TClark
Mystery1 - Call Stack
TClark
mystery1(54321)
123455432 …1
TClark
Mystery1 - Call Stack
TClark
mystery1(54321)
1234554321
TClark
Mystery1 - Call Stack
TClark
1234554321
TClark
Mystery1 - Call Stack
TClark
1234554321
TClark
Mystery1 - Call Stack
TClark
Recursive Practice:
M2 Call Stack
75
75
TClark
TClark
TClark
Mystery2 - Call Stack
TClark
TClark
Mystery2 - Two Parts
TClark
input is zero → return 1
multiply three times the mystery2 call with next smaller integer
TClark
mystery2(4)
3 * mystery2(3)
3 * mystery2(2)
3 * mystery2(1)
3 * mystery2(0)
1 ← BASE CASE
TClark
Mystery2 - Call Stack
TClark
mystery2(4)
3 * mystery2(3)
3 * mystery2(2)
3 * mystery2(1)
3 * 1
TClark
Mystery2 - Call Stack
TClark
mystery2(4)
3 * mystery2(3)
3 * mystery2(2)
3 * mystery2(1)
3
TClark
Mystery2 - Call Stack
TClark
mystery2(4)
3 * mystery2(3)
3 * mystery2(2)
3 * 3
TClark
Mystery2 - Call Stack
TClark
mystery2(4)
3 * mystery2(3)
3 * mystery2(2)
9
TClark
Mystery2 - Call Stack
TClark
mystery2(4)
3 * mystery2(3)
3 * 9
TClark
Mystery2 - Call Stack
TClark
mystery2(4)
3 * mystery2(3)
27
TClark
Mystery2 - Call Stack
TClark
mystery2(4)
3 * 27
TClark
Mystery2 - Call Stack
TClark
mystery2(4)
81
TClark
Mystery2 - Call Stack
TClark
81
TClark
Mystery2 - Call Stack
TClark
81
TClark
Mystery2 - Call Stack
TClark
END
89
89
TClark
TClark
TClark