Recursion: Why It Works - Computer Science and...
Transcript of Recursion: Why It Works - Computer Science and...
![Page 1: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/1.jpg)
Recursion: Why It Works
26 April 2013 OSU CSE 1
![Page 2: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/2.jpg)
Question Considered Before
• How should you think about recursion so you can use it to develop elegant recursive methods to solve certain problems?
• Answer: Pretend there is a FreeLunch class with a method that has the same contract as the code you’re trying to write (but it works only for smaller problems)
26 April 2013 OSU CSE 2
![Page 3: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/3.jpg)
Question Considered Now
• Why do those recursive methods work?
26 April 2013 OSU CSE 3
![Page 4: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/4.jpg)
Question Considered Only Later
• How do those recursive methods work? – Don’t worry; we will come back to this – If you start by insisting on knowing the answer
to this question, you may never be fully capable of developing elegant recursive solutions to problems!
26 April 2013 OSU CSE 4
![Page 5: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/5.jpg)
Example #1 private static String reversedString(String s) { if (s.length() == 0) { return s; } else { String sub = s.substring(1); String revSub = reversedString(sub); String result = revSub + s.charAt(0); return result; } }
26 April 2013 OSU CSE 5
![Page 6: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/6.jpg)
Example #1 private static String reversedString(String s) { if (s.length() == 0) { return s; } else { String sub = s.substring(1); String revSub = reversedString(sub); String result = revSub + s.charAt(0); return result; } }
26 April 2013 OSU CSE 6
There is no reason to declare the variable result, only to
return it in the next statement.
![Page 7: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/7.jpg)
Example #1 Slightly Simplified private static String reversedString(String s) { if (s.length() == 0) { return s; } else { String sub = s.substring(1); String revSub = reversedString(sub); return revSub + s.charAt(0); } }
26 April 2013 OSU CSE 7
![Page 8: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/8.jpg)
Confidence-Building Approach
• We can make an intuitive confidence-building argument that the code is correct (i.e., correctly implements its contract)
• Consider the size metric that allows you to argue that a smaller problem is being solved by each recursive call in your code – In this example, recall we used as a measure
of problem size |s|, the length of the value of parameter s
26 April 2013 OSU CSE 8
![Page 9: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/9.jpg)
First, a Smallest Problem
• First, consider each smallest problem according to that metric – In this example, there is exactly one smallest
problem: |s| = 0, i.e., s = < > • Convince yourself that your code works
correctly for each smallest problem – Trace the code (though you could also
execute it as if testing it on these cases)
26 April 2013 OSU CSE 9
![Page 10: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/10.jpg)
Trace Code With |s| = 0
26 April 2013 OSU CSE 10
s = ""
if (s.length() == 0) {
s = ""
return s;
![Page 11: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/11.jpg)
Trace Code With |s| = 0
26 April 2013 OSU CSE 11
s = ""
if (s.length() == 0) {
s = ""
return s;
The code in this case returns the value ""
(since s = "") and this satisfies the postcondition reversedString = rev(s)
so it works when |s| = 0.
![Page 12: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/12.jpg)
Then, a Next-Smallest Problem
• Now, consider a next-smallest problem according to that metric – In this example, there are many next-smallest
problems, but all have |s| = 1, e.g., these include s = "a", s = "X", s = "%", etc.
• Convince yourself that your code works correctly for each of these next-smallest problems – Maybe one such problem is convincing...
26 April 2013 OSU CSE 12
![Page 13: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/13.jpg)
Trace Code With |s| = 1
26 April 2013 OSU CSE 13
s = "X"
if (s.length() == 0) { ... } else {
s = "X"
String sub = s.substring(1);
s = "X" sub = ""
String revSub = reversedString(sub);
s = "X" sub = "" revSub = ""
return revSub + s.charAt(0);
![Page 14: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/14.jpg)
Trace Code With |s| = 1
26 April 2013 OSU CSE 14
s = "X"
if (s.length() == 0) { ... } else {
s = "X"
String sub = s.substring(1);
s = "X" sub = ""
String revSub = reversedString(sub);
s = "X" sub = "" revSub = ""
return revSub + s.charAt(0);
How do we know what this recursive call does? We just convinced ourselves it
satisfies its contract in this case because |sub| = 0
in this recursive call.
![Page 15: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/15.jpg)
Trace Code With |s| = 1
26 April 2013 OSU CSE 15
s = "X"
if (s.length() == 0) { ... } else {
s = "X"
String sub = s.substring(1);
s = "X" sub = ""
String revSub = reversedString(sub);
s = "X" sub = "" revSub = ""
return revSub + s.charAt(0);
The code in this case returns the value "X"
(since revSub = "" and s = "X") and this satisfies the postcondition reversedString = rev(s)
so it works when |s| = 1.
![Page 16: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/16.jpg)
Trace Code With |s| = 1
26 April 2013 OSU CSE 16
s = "X"
if (s.length() == 0) { ... } else {
s = "X"
String sub = s.substring(1);
s = "X" sub = ""
String revSub = reversedString(sub);
s = "X" sub = "" revSub = ""
return revSub + s.charAt(0);
Note that concluding “it works when |s| = 1”
demands that we generalize from the one case we traced/tested, realizing that there was nothing at all special
about the assumption s = "X".
![Page 17: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/17.jpg)
Then, a Next-Smallest Problem
• Now, consider a next-smallest problem according to that metric – In this example, there are many next-smallest
problems, but all have |s| = 2, e.g., these include s = "rx", s = "PU", etc.
• Convince yourself that your code works correctly for each of these next-smallest problems – Maybe one such problem is convincing...
26 April 2013 OSU CSE 17
![Page 18: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/18.jpg)
Trace Code With |s| = 2
26 April 2013 OSU CSE 18
s = "PU"
if (s.length() == 0) { ... } else {
s = "PU"
String sub = s.substring(1);
s = "PU" sub = "U"
String revSub = reversedString(sub);
s = "PU" sub = "U" revSub = "U"
return revSub + s.charAt(0);
![Page 19: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/19.jpg)
Trace Code With |s| = 2
26 April 2013 OSU CSE 19
s = "PU"
if (s.length() == 0) { ... } else {
s = "PU"
String sub = s.substring(1);
s = "PU" sub = "U"
String revSub = reversedString(sub);
s = "PU" sub = "U" revSub = "U"
return revSub + s.charAt(0);
How do we know what this recursive call does? We just convinced ourselves it
satisfies its contract in this case because |sub| = 1
in this recursive call.
![Page 20: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/20.jpg)
Trace Code With |s| = 2
26 April 2013 OSU CSE 20
s = "PU"
if (s.length() == 0) { ... } else {
s = "PU"
String sub = s.substring(1);
s = "PU" sub = "U"
String revSub = reversedString(sub);
s = "PU" sub = "U" revSub = "U"
return revSub + s.charAt(0);
The code in this case returns the value "UP"
(revSub = "U" and s = "PU") and this satisfies the postcondition reversedString = rev(s)
so it seems to work when |s| = 2.
![Page 21: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/21.jpg)
Trace Code With |s| = 2
26 April 2013 OSU CSE 21
s = "PU"
if (s.length() == 0) { ... } else {
s = "PU"
String sub = s.substring(1);
s = "PU" sub = "U"
String revSub = reversedString(sub);
s = "PU" sub = "U" revSub = "U"
return revSub + s.charAt(0);
Note that concluding “it works when |s| = 2”
demands that we generalize from the one case we traced/tested, realizing that there was nothing at all special
about the assumption s = "PU".
![Page 22: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/22.jpg)
Then, a Next-Smallest Problem
• Now, consider a next-smallest problem according to that metric – In this example, there are many next-smallest
problems, but all have |s| = 3, e.g., these include s = "cse", s = "OSU", etc.
• Convince yourself that your code works correctly for each of these next-smallest problems – Maybe one such problem is convincing...
26 April 2013 OSU CSE 22
![Page 23: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/23.jpg)
Trace Code With |s| = 3
26 April 2013 OSU CSE 23
s = "OSU"
if (s.length() == 0) { ... } else {
s = "OSU"
String sub = s.substring(1);
s = "OSU" sub = "SU"
String revSub = reversedString(sub);
s = "OSU" sub = "SU" revSub = "US"
return revSub + s.charAt(0);
![Page 24: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/24.jpg)
Trace Code With |s| = 3
26 April 2013 OSU CSE 24
s = "OSU"
if (s.length() == 0) { ... } else {
s = "OSU"
String sub = s.substring(1);
s = "OSU" sub = "SU"
String revSub = reversedString(sub);
s = "OSU" sub = "SU" revSub = "US"
return revSub + s.charAt(0);
How do we know what this recursive call does? We just convinced ourselves it
satisfies its contract in this case because |sub| = 2
in this recursive call.
![Page 25: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/25.jpg)
Trace Code With |s| = 3
26 April 2013 OSU CSE 25
s = "OSU"
if (s.length() == 0) { ... } else {
s = "OSU"
String sub = s.substring(1);
s = "OSU" sub = "SU"
String revSub = reversedString(sub);
s = "OSU" sub = "SU" revSub = "US"
return revSub + s.charAt(0);
The code in this case returns the value "USO"
(revSub = "US" and s = "OSU") and this satisfies the postcondition reversedString = rev(s)
so it seems to work when |s| = 3.
![Page 26: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/26.jpg)
Trace Code With |s| = 3
26 April 2013 OSU CSE 26
s = "OSU"
if (s.length() == 0) { ... } else {
s = "OSU"
String sub = s.substring(1);
s = "OSU" sub = "SU"
String revSub = reversedString(sub);
s = "OSU" sub = "SU" revSub = "US"
return revSub + s.charAt(0);
Note that concluding “it works when |s| = 3”
demands that we generalize from the one case we traced/tested, realizing that there was nothing at all special
about the assumption s = "OSU".
![Page 27: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/27.jpg)
And So On...
• You should see that this reasoning process could continue long enough to reach any finite integer length, with the conclusion that the code works for any value of s – Because s must have a finite length; why?
26 April 2013 OSU CSE 27
![Page 28: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/28.jpg)
Proof by Induction
• A formal version of this argument follows the proof technique known as mathematical induction – Recursion and induction are entirely parallel
concepts
26 April 2013 OSU CSE 28
![Page 29: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/29.jpg)
Proof by Contradiction
• Another formal proof technique known as proof by contradiction can also be used – “Suppose the code does not work for some s.
Then there must be a shortest s for which it does not work. So, assume |s| = n. Now let’s show that this assumption leads to the conclusion that the code must not work for some string of length n–1. This is a contradiction. Hence, there cannot be any such s for which the code does not work.”
26 April 2013 OSU CSE 29
![Page 30: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/30.jpg)
Proof by Contradiction
• Another formal proof technique known as proof by contradiction can also be used – “Suppose the code does not work for some s.
Then there must be a shortest s for which it does not work. So, assume |s| = n. Now let’s show that this assumption leads to the conclusion that the code must not work for some string of length n–1. This is a contradiction. Hence, there cannot be any such s for which the code does not work.”
26 April 2013 OSU CSE 30
Some people find this kind of proof easier to understand than
induction, but it does not seem to have a simplified intuitive basis
like induction does.
![Page 31: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/31.jpg)
Example #2 private static void increment (NaturalNumber n) { int onesDigit = n.divideBy10(); onesDigit++; if (onesDigit == 10) { onesDigit = 0; increment(n); } n.multiplyBy10(onesDigit); }
26 April 2013 OSU CSE 31
![Page 32: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/32.jpg)
First, a Smallest Problem
• First, consider each smallest problem according to the size metric: the value of the parameter n – In this example, there is exactly one smallest
problem: n = 0 • Convince yourself that your code works
correctly for each smallest problem – Trace through the code with n = 0
26 April 2013 OSU CSE 32
![Page 33: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/33.jpg)
Then, a Next-Smallest Problem
• Next, consider a next-smallest problem according to that metric – In this example, there is exactly one next-
smallest problem: n = 1 • Convince yourself that your code works
correctly for each of these next-smallest problems • Trace through the code with n = 1
26 April 2013 OSU CSE 33
![Page 34: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/34.jpg)
And So On...
• On this example, the intuitive confidence-building argument may be slightly more convincing because every value of parameter n is covered directly in one of the steps
• But it takes 9 steps before anything interesting even happens!
26 April 2013 OSU CSE 34
![Page 35: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/35.jpg)
Conclusion
• The purpose of the confidence-building method is (as its name suggests) to give you confidence that the code works – A nice feature is that it suggests some test
cases, should you decide to run the code on the computer rather than tracing it manually
– However, you still need to have traced it — albeit perhaps only mentally — in order to have written the code in the first place!
26 April 2013 OSU CSE 35
![Page 36: Recursion: Why It Works - Computer Science and …web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/23...Question Considered Only Later • How do those recursive methods](https://reader035.fdocuments.us/reader035/viewer/2022062402/5ad5f4927f8b9a1a028dbef0/html5/thumbnails/36.jpg)
Conclusion
• The purpose of the confidence-building method is (as its name suggests) to give you confidence that the code works – A nice feature is that it suggests some test
cases, should you decide to run the code on the computer rather than tracing it manually
– However, you still need to have traced it — albeit perhaps only mentally — in order to have written the code in the first place!
26 April 2013 OSU CSE 36
You might be surprised how many people who should know better seem not to have noticed this
rather obvious conclusion!