Rekurzija Fantasticno!!!!
Rekurzija Fantasticno!!!!
n! = n(n-1)(n-2)…1
def factorial(n):
result = 1
for k in range(1, n+1):
result = result * k
return result
Recursion…
n! = n(n-1)(n-2)…1
n! = n (n-1)! “inductive definition”
Recursion…
n! = n(n-1)(n-2)…1
n! = n x (n-1)! “inductive definition”
0! = 1 “base case”
Why is
0! = 1?
Math Induction = CS Recursion
0! = 1 # recursive factorial
def factorial(n):
n! = n (n-1)! if n == 0:
return 1
else:
return n * factorial(n-1)
Is Recursion Magic?
factorial(3):
return 3 * factorial(2)
# recursive factorial
def factorial(n):
if n == 0:
return 1
else:
return n*factorial(n-1)
Is Recursion Magic?
factorial(3):
return 3 * factorial(2)
return 2 * factorial(1)
# recursive factorial
def factorial(n):
if n == 0:
return 1
else:
return n*factorial(n-1)
Is Recursion Magic?
factorial(3):
return 3 * factorial(2)
return 2 * factorial(1)
return 1 * factorial(0)
# recursive factorial
def factorial(n):
if n == 0:
return 1
else:
return n*factorial(n-1)
Is Recursion Magic?
factorial(3):
return 3 * factorial(2)
return 2 * factorial(1)
1
return 1 * factorial(0)
# recursive factorial
def factorial(n):
if n == 0:
return 1
else:
return n*factorial(n-1)
Is Recursion Magic?
factorial(3):
return 3 * factorial(2)
return 2 * factorial(1)
1
return 1 * factorial(0)
# recursive factorial
def factorial(n):
if n == 0:
return 1
else:
return n*factorial(n-1)
Is Recursion Magic?
factorial(3):
return 3 * factorial(2)
2
return 2 * factorial(1)
1
return 1 * factorial(0)
# recursive factorial
def factorial(n):
if n == 0:
return 1
else:
return n*factorial(n-1)
Is Recursion Magic?
factorial(3): 6
return 3 * factorial(2)
2
return 2 * factorial(1)
1
return 1 * factorial(0)
# recursive factorial
def factorial(n):
if n == 0:
return 1
else:
return n*factorial(n-1)
Computing the length of a list
>>> len([1, 42, “spam”]) Python has
3 this built-in!
>>> len([1, [2, [3, 4]]])
2
def len(L):
‘’’returns the length of list L’’’
Computing the length of a list
>>> len([1, 42, “spam”]) Python has
3 this built-
>>> len([1, [2, [3, 4]]]) in!
2
def len(L):
‘’’returns the length of list L’’’
if L == []: return 0 # base case
Computing the length of a list
>>> len([1, 42, “spam”])
3
>>> len([1, [2, [3, 4]]])
2
def len(L):
‘’’returns the length of list L’’’
if L == []: return 0 # base case
else: return 1 + len(L[1:])
Summing up the numbers in a list
>>> sum([3, 42, 7])
52 Python has
>>> sum([42]) this built-in
42 too!
>>> sum([])
0
def sum(L):
‘’’returns the sum of numbers in the list’’’
Worksheet
Summing up the numbers in a list
>>> sum([1, 42, 7])
50
>>> sum([42])
42 The base
>>> sum([]) case takes
0 care of the
simplest
case we
def sum(L): could get.
‘’’returns the sum of numbers in the list’’’
if L == []: return 0
Summing up the numbers in a list
>>> sum([1, 42, 7])
50
>>> sum([42])
42
>>> sum([])
0
def sum(L):
‘’’returns the sum of numbers in the list’’’
if L == []: return 0
else: return ???
Summing up the numbers in a list
>>> sum([1, 42, 7])
50
>>> sum([42])
42
>>> sum([])
0
def sum(L):
‘’’returns the sum of numbers in the list’’’
if L == []: return 0
else: return L[0] + sum(L[1:])
Recursion = :^)
“To understand recursion, you
must first understand recursion”
-anonymous Mudd alum
The following pages have
a number of exercises for
you to do (in your notes).
You’re welcome to work
at your own pace.
min
member
pal
Minimum! [ , , ]
def min(L):
‘’’ returns smallest value in the list L ‘’’
Minimum! [ , , ]
def min(L):
‘’’ returns smallest value in the list L ‘’’
if ??? # base case?
Minimum! [ , , ]
def min(L):
‘’’ returns smallest value in the list L ‘’’
if len(L) == 1: return L[0] # base case!
return L[0]
else: return min(L[1:]
Minimum! [ , , ]
def min(L):
‘’’ returns smallest value in the list L ‘’’
if len(L) == 1: return L[0] # base case!
elif L[0] < min(L[1:]): ???return L[0]
else: return min(L[1:]
Minimum! [ , , ]
def min(L):
‘’’ returns smallest value in the list L ‘’’
if len(L) == 1: return L[0] # base case?
elif L[0] < min(L[1:]): return L[0]
else: return ???
Minimum! [ , , ]
def min(L):
‘’’ returns smallest value in the list L ‘’’
if len(L) == 1: return L[0] # base case?
elif L[0] < min(L[1:]): return L[0]
else: return min(L[1:])
Member
(Skipped in Class, Study on your own)
>>> member(42, [1, 3, 5, 42, 7])
This is sort of like the “in”
True thing in Python, but don’t
>>> member(42, ['spam', 'is', 'yummy']) use “in” here. Just list
indexing, slicing, and
False
recursion!
def pal(myString):
‘’’ returns True if myString is a
palindrome and False otherwise ‘’’
Palindrome?
>>> pal('radar')
True
>>> pal('amanaplanacanalpanama')
True
>>> pal('spam')
False
def pal(myString):
‘’’ returns True if myString is a
palindrome and False otherwise ‘’’
if len(myString) <= 1: return True # base case
Palindrome?
>>> pal('radar')
True
>>> pal('amanaplanacanalpanama')
True
>>> pal('spam')
False
def pal(myString):
‘’’ returns True if myString is a
palindrome and False otherwise ‘’’
if len(myString) <= 1: return True # base case
elif myString[0] != myString[-1]:
return False
else:
Palindrome?
>>> pal('radar')
True
>>> pal('amanaplanacanalpanama')
True
>>> pal('spam')
False
def pal(myString):
‘’’ returns True if myString is a
palindrome and False otherwise ‘’’
if len(myString) <= 1: return True # base case
elif myString[0] != myString[-1]:
return False
else: return pal(myString[1:-1])
Change
In this problem,
we’re allowed
to use a coin
denomination
as many times
as we want!
Change
In this problem,
we’re allowed
to use a coin
denomination
as many times
as we want!
Change
>>> change(42, [25, 21, 1])
2
Let’s make
change together!
def change(amount, Coins):
Change
>>> change(42, [25, 21, 1]) We’re making change!
loseIt =
return _____________________________________________
Change
>>> change(42, [25, 21, 1]) Python has a built in min
2 function: min(42,5)is 5
loseIt =
loseIt =
useIt loseIt
useIt loseIt
def change(amount, Coins):
1+change(1, [ 1]) change(2, [ ]) if amount == 0: return 0
elif Coins == []: return float(‘inf’)
else:
It = Coins[0]
useIt loseIt if It > amount:
return change(amount, Coins[1:])
else:
useIt = 1 + change(amount-It, Coins)
1+change(0, [ 1]) change(1, [ ]) loseIt = change(amount, Coins[1:])
return min(useIt, loseIt)
change(10, [8, 5, 1])
useIt loseIt
useIt loseIt
def change(amount, Coins):
1+change(1, [ 1]) change(2, [ ]) if amount == 0: return 0
elif Coins == []: return float(‘inf’)
else:
It = Coins[0]
useIt loseIt if It > amount:
return change(amount, Coins[1:])
else:
useIt = 1 + change(amount-It, Coins)
1+change(0, [ 1]) change(1, [ ]) loseIt = change(amount, Coins[1:])
return min(useIt, loseIt)
change(10, [8, 5, 1])
useIt loseIt
useIt loseIt
def change(amount, Coins):
1+change(1, [ 1]) change(2, [ ]) if amount == 0: return 0
elif Coins == []: return float(‘inf’)
else:
1 useIt loseIt
It = Coins[0]
if It > amount:
return change(amount, Coins[1:])
else:
useIt = 1 + change(amount-It, Coins)
1+change(0, [ 1]) change(1, [ ]) loseIt = change(amount, Coins[1:])
return min(useIt, loseIt)
change(10, [8, 5, 1])
useIt loseIt
useIt loseIt
def change(amount, Coins):
1+change(1, [ 1]) change(2, [ ]) if amount == 0: return 0
elif Coins == []: return float(‘inf’)
else:
1 useIt loseIt inf It = Coins[0]
if It > amount:
return change(amount, Coins[1:])
else:
useIt = 1 + change(amount-It, Coins)
1+change(0, [ 1]) change(1, [ ]) loseIt = change(amount, Coins[1:])
return min(useIt, loseIt)
change(10, [8, 5, 1])
useIt loseIt
2 useIt loseIt
def change(amount, Coins):
1+change(1, [ 1]) change(2, [ ]) if amount == 0: return 0
elif Coins == []: return float(‘inf’)
else:
1 useIt loseIt inf It = Coins[0]
if It > amount:
return change(amount, Coins[1:])
else:
useIt = 1 + change(amount-It, Coins)
1+change(0, [ 1]) change(1, [ ]) loseIt = change(amount, Coins[1:])
return min(useIt, loseIt)
change(10, [8, 5, 1])
useIt loseIt
useIt loseIt
useIt loseIt