recursion - see recursion. rhs – soc 2 recursion we know that: –we can define classes –we can...
TRANSCRIPT
![Page 1: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/1.jpg)
Recursion- see Recursion
![Page 2: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/2.jpg)
RHS – SOC 2
Recursion
• We know that:– We can define classes– We can define
methods on classes– Mehtods can call other
methods
• But…can a method call itself…?
![Page 3: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/3.jpg)
RHS – SOC 3
Recursion
public void callMe()
{
System.out.println(”Hello”);
callMe();
}
![Page 4: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/4.jpg)
RHS – SOC 4
Recursion
• Previous method definition was legal, but hardly useful…
• Just calling the same method will result in an infinite loop
• BUT what if we– Supply a parameter to the method– Change the parameter in each call– Stop calling ourselves for some specific value
![Page 5: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/5.jpg)
RHS – SOC 5
Recursion
public void callMe(int calls)
{
if (calls > 0)
{
System.out.println(”Hello”);
int fewercalls = calls – 1;
callMe(fewercalls);
}
}
![Page 6: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/6.jpg)
RHS – SOC 6
Recursion
• Calling methods like this is often called recursion
• The previous example could easily be rewritten as a ”traditional” loop, and would even be more efficient
• However, quite a lot of problems can be solved very elegantly by recursion
![Page 7: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/7.jpg)
RHS – SOC 7
Recursion
• Example: the factorial function
• The factorial function F(n) is defined as:
F(n) = n × (n-1) × (n-2) × … × 2 × 1
• But you could also define F(n) as:
F(n) = n × F(n-1)
![Page 8: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/8.jpg)
RHS – SOC 8
Recursion
public void factorial(int n)
{
int result = 1;
for (int val = 1; val <= n; val++)
{
result = result * val;
}
return result
}
![Page 9: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/9.jpg)
RHS – SOC 9
Recursion
public void factorial(int n)
{
if (n <= 1)
return 1;
else
return (n * factorial(n-1));
}
![Page 10: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/10.jpg)
RHS – SOC 10
Thinking recursively
• Thinking in terms of recursion may seem quite confusing at first
• However, one should try not to think about how it works in detail
• Think in terms of how a problem can be solved, by solving ”simpler” versions of the same problem
![Page 11: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/11.jpg)
RHS – SOC 11
Thinking recursively
• Solving a problem by recursion:– Control step: Does the problem have a
simple solution?– Division step: Split the problem into a simpler
problem, plus a residual– Solution step: Solve the simpler problem– Combination step: Combine the solution to
the simpler problem with the residual, in order to solve the original problem
![Page 12: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/12.jpg)
RHS – SOC 12
Thinking recursively
• Solving the factorial function by recursion:
• Control step: – Is n < 1? If so, the result is 1
• Division step: – Original problem: F(n)– Simpler problem: F(n-1)– Residual: n
![Page 13: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/13.jpg)
RHS – SOC 13
Thinking recursively
• Solving the factorial function by recursion:
• Solution step: – Solve F(n-1) (go to top…)
• Combination step:– Combine by multiplying F(n-1) with n
![Page 14: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/14.jpg)
RHS – SOC 14
Thinking recursively
public void factorial(int n)
{
if (n <= 1)
return 1;
else
return (n * factorial(n-1));
}
Control Step
Solution Step
Combination Step
Division Step
![Page 15: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/15.jpg)
RHS – SOC 15
Thinking recursively
• A slightly harder problem is string permutations:– Given a string of text, find all possible
permutations of the characters in the string– A string of length n will have n! different
permutations
![Page 16: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/16.jpg)
RHS – SOC 16
Thinking recursively
• The string ”cat” has 3! = 6 permutations:– ”cat”– ”cta”– ”act”– ”atc”– ”tac”– ”tca”
![Page 17: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/17.jpg)
RHS – SOC 17
Thinking recursively
• Solving string permutations by recursion:
• Control step: – Does the string have length 1? If so, the result
is the string itself
![Page 18: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/18.jpg)
RHS – SOC 18
Thinking recursively
• Solving string permutations by recursion:
• Division step: – For each character c in the string:
• Let c be the residual• Remove c from the original string. • The resulting string is then the simpler problem
![Page 19: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/19.jpg)
RHS – SOC 19
Thinking recursively
• Solving string permutations by recursion:
• Solution step: – For each string S generated during the
division step:• Find all permutations of S
![Page 20: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/20.jpg)
RHS – SOC 20
Thinking recursively
• Solving string permutations by recursion:
• Combination step: – For each string S generated during the
solution step:• Combine S with the residual character c, by adding
c to the front of S (permutation = c + S)• Add the permutation to the result set
![Page 21: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/21.jpg)
RHS – SOC 21
Thinking recursively
• Solving string permutation by recursion is not trivial…
• …but try to write an algorithm for string permutation without using recursion!
• Trust that it works!
• When there is a simple solution to simple inputs, and the problem can be solved by solving it for simpler inputs, it will work!
![Page 22: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/22.jpg)
RHS – SOC 22
Recursive helper methods
• It is sometimes easier to solve a more general problem by recursion
• Example: How to find a palindrome (a string which is equal to its own reverse)
• Possible interface to a Sentence class:– Sentence(String theSentence)– boolean isPalindrome()
![Page 23: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/23.jpg)
RHS – SOC 23
Recursive helper methodspublic boolean isPalindrome()
{
int len = text.length();
if (len < 2)
return true;
if ((text.substring(0,1).equals(text.substring(len-1,len)))
{
Sentence newSen = new Sentence(text.substring(1,len-1));
return newSen.isPalindrome();
}
else
return false;
}
![Page 24: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/24.jpg)
RHS – SOC 24
Recursive helper methods
• Previous implementation works, but is somewhat inefficient
• We create a lot of Sentence objects
• Let us include a helper method, that checks if a substring is a palindrome:
boolean isPalindrome(int start, int end)
![Page 25: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/25.jpg)
RHS – SOC 25
Recursive helper methodspublic boolean isPalindrome(int start, int end)
{
int len = end – start;
if (len < 2)
return true;
if ((text.substring(start,start+1).equals(
text.substring(end-1,end)))
return isPalindrome(start+1,end-1);
else
return false;
}
![Page 26: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/26.jpg)
RHS – SOC 26
Recursive helper methods
• Finally, implement original method by using the helper method:
public boolean isPalindrome()
{
return text.isPalindrome(0, lext.length() – 1);
}
![Page 27: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/27.jpg)
RHS – SOC 27
Exercises
• Review: R13.2, R13.3
• Programming: P13.1, P13.4
![Page 28: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/28.jpg)
RHS – SOC 28
Efficiency of recursion
• Recursion is a very elegant principle, but not always the correct strategy…
• Can result in very inefficient algorithms, if care is not taken
• Common pitfall is to calculate identical values over and over
![Page 29: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/29.jpg)
RHS – SOC 29
Efficiency of recursion
• Example: Calculating Fibonacci numbers– Fib(1) = 1– Fib(2) = 1– Fib(n) = Fib(n-1) + Fib(n-2)
• Looks like a recursive solution is a no-brainer…
![Page 30: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/30.jpg)
RHS – SOC 30
Efficiency of recursion
public long fib(int n)
{
if (n <= 2)
return 1;
else
return (fib(n-1) + fib(n-2));
}
![Page 31: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/31.jpg)
RHS – SOC 31
Efficiency of recursion
• Method does work, but is very inefficient
• We calculate same values over and over
Fib(n)
Fib(n-1) Fib(n-2)
Fib(n-2) Fib(n-3)
![Page 32: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/32.jpg)
RHS – SOC 32
Recursion summary
• Recursion is a powerful and elegant tool for algorithm development
• Many algoritms are very easy to under-stand, if you understand recursion
• No silver bullet – recursive algorithms can be very slow
• Always consider (iterative) alternatives
![Page 33: Recursion - see Recursion. RHS – SOC 2 Recursion We know that: –We can define classes –We can define methods on classes –Mehtods can call other methods](https://reader030.vdocuments.net/reader030/viewer/2022032702/56649ce55503460f949b25e8/html5/thumbnails/33.jpg)
RHS – SOC 33
Exercises
• Review: R13.6, R13.7
• Programming: P13.6, P13.10