04 Recursion Tdd.pptx
04 Recursion Tdd.pptx
Lesson 04:
Recursion and
Test Driven Development (TDD)
•
Recursive Sum
• Idea: if we can sum up to n-1, then, to sum up to n, we can
just add n
• f(n) = n + f(n-1)
• f(5) = 5 + f(4)
• f(4) = 4 + f(3)
• f(3) = 3 + f(2)
• f(2) = 2 + f(1)
• f(1) = 1 + f(0)
• f(0) = 0 + f(-1)
• f(-1) = -1 + f(-2)
• f(-2) = -2 + f(-3)
• etc.
What If No
Stopping?
• Before f(n) is completed, f(n-1) must be completed
• And so on…
left =? end = ?
right = ? right = ?
middle = ? middle =?
e=0 e=1
s=0 s=1
a=… a=…
left = ? left = 5 left = 5 left = 5
right = ? right = ? right = ? right = 6
middle = 0 middle = 0 middle = 0 middle = 0
e=1 e=1 e=1 e=1
s=0 s=0 s=0 s=0
a=… a=… a=… a=…
left = ? left = ? left = ? left = ? left = 11
right = ? right = ? right = ? right = ? right = ?
middle = 1 middle = 1 middle = 1 middle = 1 middle = 1
e=3 e=3 e=3 e=3 e=3
s=0 s=0 s=0 s=0 s=0
a=… a=… a=… a=… a=…
• Once we compute left=11, we enter in the call
right=sumY(middle+1,e)
end = ? left = ?
right = ? right =?
middle =? middle = ?
e=2 e=3
s=2 s=3
a=… a=…
left = ? left = ? left = 7 left = 7
right = ? right = ? right = ? right = ?
middle = 2 middle = 2 middle = 2 middle = 2
e=3 e=3 e=3 e=3
s=2 s=2 s=2 s=2
a=… a=… a=… a=…
left = 11 left = 11 left = 11 left = 11 left = 11
right = ? right = ? right = ? right = ? right = ?
middle = 1 middle = 1 middle = 1 middle = 1 middle = 1
e=3 e=3 e=3 e=3 e=3
s=0 s=0 s=0 s=0 s=0
a=… a=… a=… a=… a=…
• Once both left and right are recursively computed,
the final returned result is 11+15 = 26
left = ?
right =?
middle = ?
e=3
s=3
a=…
left = 7 left = 7
right = ? right = 8
middle = 2 middle = 2
e=3 e=3
s=2 s=2
a=… a=…
left = 11 left = 11 left = 11
right = ? right = ? right = 15
26
middle = 1 middle = 1 middle = 1
e=3 e=3 e=3
s=0 s=0 s=0
a=… a=… a=…
Space Complexity
•
Important to Remember
• Recursive implementation
• Between N/2 and N comparisons: once reached end of one half, copy over the other
1 4 5 1 4 5
2 3 6 2 3 6
1 1 2
1 4 5 1 4 5
2 3 6 2 3 6
1 2 3 1 2 3 4
Cost
•
Considerations
• Asymptotically, does not exist comparison-based
sorting better than O(n log n)
•
Recursion
• Still Divide and Conquer algorithm, like Merge Sort
1 3 7 5 4 2 6
• Scan from left till > 5, from right till < 5
• Unless you have very specific, advanced cases, you use the
default of what is given by the standard library of the
language/framework you use
- Refactor to
improve
code
Example: A List
class List{
}
First Unit Test
void testEmptyList(){
Assert.equals( 0 , list.size());
class List{
class List{
int counter = 0;
}
Integration Step
• As all test cases do pass, make changes permanent
int counter = 0;
}
Write A Second Test
void testInsertOneElement(){
list.insert(42);
Assert.equals( 1 , list.size());
}
This will fail!
Minimal Fix
Does not work:
class List{ - testInsertOneElement does pass
- but testEmptyList will fail
int counter = 1;
}
Still need all passing tests
class List{
int counter = 0;
}
Refactoring Step
Do not do that!
class List{
You have no test
int[] data = new int[16]; case checking for
int counter = 0;
internal state!
counter++;}
}
New Empty Stub
class List{
int counter = 0;
}
Write A Third Test
void testInsertAndGetOneElement(){
}
This will fail!
Minimal Fix Before
Refactoring
class List{
int counter = 0;
}
And so on... keep
following the cycle
Test
Integrate Code
Refactor
Measuring Test
Effectiveness
• Do exercises in exercises/ex04