1 programming for engineers in python autumn 2011-12 lecture 8: recursion
DESCRIPTION
3 Lecture 6 (OOP): Highlights Representation design options and implications (Rectangle) Inheritance and Polymorphism Rational - customize classes so that they are natural to use Attributes, methods, constructor Method overriding (e.g., __str__) Operators overloading (e.g., __add__)TRANSCRIPT
1
Programming for Engineers in
Python
Autumn 2011-12
Lecture 8: Recursion
2
Lecture 7: Highlights
3
Lecture 6 (OOP): Highlights• Representation design options and implications (Rectangle)• Inheritance and Polymorphism• Rational - customize classes so that they are natural to use
• Attributes, methods, constructor• Method overriding (e.g., __str__)• Operators overloading (e.g., __add__)
4
Variables in Functions• Defined only in the function’s scope• Are not available for other functions/shell (even function’s parameters)• Upon completion of execution:
•Variables are not defined anymore•Variables values are not kept for future invocations of the function
5
The Call Stack
call stack
resultmain
base
exponent
res
ipower
= 2
= 20
= 3
= 15
= 5
= 17
6
Towers of Hanoi
• Objective:• Move the entire stack of disks from rode S
(source) to T (target) using A (auxiliary)
S TA
7
The Rules
• Only one disk may be moved at a time• Each move consists of taking the upper disk from one
of the rods and sliding it onto another rod• No disk may be placed on top of a smaller disk
S TA
8
Examples
S TA
1 disk – very easy!
S TA
2 disks – very easy!
S TA3 disks – easy
S TA4 disks?
9
Solution for 4 Disks
S TA
S TA
S TA
S TA
10
For n Disks?
S TA
11
Assume We Have a Solution for n-1 Disks
S TA
12
Solution: Step 1
S TA
13
Solution: Step 2
S TA
14
Solution: Step 3
S TA
15
How to Solve for n-1 Disks?
Easy!
16
Algorithm for n Disks
S TA
1. If there is only a single disk – easy!2. Move n-1 disks from S to A (T is the auxiliary rode)3. Move disk from S to T4. Move n-1 disks from A to T (S is the auxiliary rode)
Let us write it in Python…
17
A Python Program for Towers of Hanoi
18
Remember the Calling Stack?
hanoi(3,'S','T','A')main
hanoi(2,'S',‘A',‘T')
hanoi(1,‘S',‘T',‘A')
And so on…
19
Recursion
• We use Recursion to solve the Towers of Hanoi problem
• Recursion: a function whose implementation references itself
• Recursion enables to solve a “large” problem using solutions to “small” problems that assemble it
• In every recursive call the problem is reduced. When the problem is small enough -solve directly (base case, מקרה קצה)
• Divide and conquer
20
Iterative Versus Recursive
Step by step (iteratively): 4! = 1*2*3*4 = 2*3*4 = 6*4 = 2424 = 2*2*2*2 = 4*2*2 = 8*2 = 16
n! = 1*2*3*….*nan = a*a*…..*a
n iterations
n! = n*(n-1)!0! = 1
Recursively: 4! = 4*3! = 4*(3*2!) = 4*(3*(2*1!)) = 4*(3*(2*(1*0!))) = 4*(3*(2*(1*1))) = 4*(3*(2*1)) = 4*(3*2) = 4*6 = 24
21
Recursive Definition
n! = n*(n-1)!0! = 1
Base condition
קצה מקרה
Recursive call
Smaller instance
Factorial
22
Pros and Cons
• Pros: short and natural for many problems• Cons: Computational inefficient, sometimes hard to
understand or inconvenient
23
Recursion Example in Python
Halting condition (and infinite loops)
Advance towards base case
24
Recursive factorial – step by step
factorial(4)n4
Returns…
25
Recursive factorial – step by step
factorial(4)n4
Returns…4*…
26
Recursive factorial – step by step
factorial(4)n4
Returns…
factorial(3)n3
Returns…
27
Recursive factorial – step by step
factorial(4)n4
Returns…
factorial(3)n3
Returns…
28
Recursive factorial – step by step
factorial(4)n4
Returns…
factorial(3)n3
Returns…3*…
29
Recursive factorial – step by step
factorial(4)n4
Returns…
factorial(3)n3
Returns…
factorial(2)n2
Returns…
30
Recursive factorial – step by step
factorial(4)n4
Returns…
factorial(3)n3
Returns…
factorial(2)n2
Returns…
31
Recursive factorial – step by step
factorial(4)n4
Returns…
factorial(3)n3
Returns…
factorial(2)n2
Returns…2*…
32
Recursive factorial – step by step
factorial(4)n4
Returns…
factorial(3)n3
Returns…
factorial(2)n2
Returns…
factorial(1)n1
Returns…
33
Recursive factorial – step by step
factorial(4)n4
Returns…
factorial(3)n3
Returns…
factorial(2)n2
Returns…
factorial(1)n1
Returns…
34
Recursive factorial – step by step
factorial(4)n4
Returns…
factorial(3)n3
Returns…
factorial(2)n2
Returns…
factorial(1)n1
Returns…1*…
35
Recursive factorial – step by step
factorial(4)n4
Returns…
factorial(3)n3
Returns…
factorial(2)n2
Returns…
factorial(1)n1
Returns…
factorial(0)n0
Returns…
36
Recursive factorial – step by step
factorial(4)n4
Returns…
factorial(3)n3
Returns…
factorial(2)n2
Returns…
factorial(1)n1
Returns…
factorial(0)n0
Returns…
37
Recursive factorial – step by step
factorial(4)n4
Returns…
factorial(3)n3
Returns…
factorial(2)n2
Returns…
factorial(1)n1
Returns…
factorial(0)n0
Returns…
38
Recursive factorial – step by step
factorial(4)n4
Returns…
factorial(3)n3
Returns…
factorial(2)n2
Returns…
factorial(1)n1
Returns…
factorial(0)n0
Returns… 1
39
Recursive factorial – step by step
factorial(4)n4
Returns…
factorial(3)n3
Returns…
factorial(2)n2
Returns…
factorial(1)n1
Returns…1*1
40
Recursive factorial – step by step
factorial(4)n4
Returns…
factorial(3)n3
Returns…
factorial(2)n2
Returns…2*1
41
Recursive factorial – step by step
factorial(4)n4
Returns…
factorial(3)n3
Returns…3*2
42
Recursive factorial – step by step
factorial(4)n4
Returns…4*6
43
General Form of Recursive Algorithms
• Base case: small (non-decomposable) problem• Recursive case: larger (decomposable) problem• At least one base case, and at least one recursive
case.
test + base case
recursive case
44
Short Summary
• Design a recursive algorithm by1. Solving big instances using the solution to smaller
instances2. Solving directly the base cases
• Recursive algorithms have1. Stopping criteria2. Recursive case(s)3. Construction of a solution using solution to smaller
instances
45
Point for Attention: Memory
• Variables of a called function are kept in memory until the function returns
• Many recursive calls might fill the computers memory
• Even if we minimize the number of variables, recursion has its price
46
Example: Fibonacci Series
• Fibonacci series0, 1, 1, 2, 3, 5, 8, 13, 21,
34• Definition:
• fib(0) = 0• fib(1) = 1• fib(n) = fib(n-1) + fib(n-2)
en.wikipedia.org/wiki/Fibonacci_number
47
סלט פיבונאצ'י
48
Recursive Fibonacci Series
Every call with n > 1 invokes 2 function calls, and so on…
49
Redundant Calls
Fib(4)
Fib(3) Fib(2)
Fib(2) Fib(1) Fib(1) Fib(0)
Fib(1)
Fib(0)
Fib(5)
Fib(3)
Fib(2) Fib(1)
Fib(1)
Fib(0)
50
Number of Calls to Fibonacci
n value Number of calls
1 1 1
2 1 3
3 2 5
23 28657 92735
24 46368 150049
51
Demonstration: Iterative Versus Recursive Fibonacci
52
Demonstration: Iterative Versus Recursive Fibonacci
Output (shell):
53
Fibonacci: Recursion and Efficiency
• If a recursive function calls itself more than once it will be extremely inefficient
• Define it iteratively
54
So Do We Really Need Recursion?
Yes!
(specific examples next week)
55
Odd-Even (if time allows)
• Given a function ‘odd(n)’ • Odd n - return True, Even n – return False
• Write a function ‘even(n)’ that:• Even n - return True, Odd n – return False
• This is easy!
56
Odd-Even
57
Odd-Even
58
Odd-Even
59
Odd-Even
Questions?
61
Off Topics• Documenting your programs• Find the error
62
Documenting Your Programs
• An essential part of writing computer code• Understand what was your intension when
writing it• For others to be able to coordinate their
code with yours• For the grader/lecturer to try and understand
your code and grade it accordingly…
63
Documenting Your Programs with Comments
• Comments: pieces of code not interpreted or executed by the computer
• One line comments start with the hash character (#)
64
Meaningful Variables Names
• Variables names• Meaningful names
Off Topic: Find the Error
And Now?
And Now?
INDENTATION IS REALLY, REALLY IMPORTANT!