Advanced Recursion
Tail recursion, memoization, divide and conquer, and recursive patterns.
Overview
Master advanced recursive techniques.
Memoization
from functools import lru_cache
@lru_cache(maxsize=None)
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(100)) # Fast with memoization
# Manual memoization
def memoize(func):
cache = {}
def wrapper(*args):
if args not in cache:
cache[args] = func(*args)
return cache[args]
return wrapper
@memoize
def factorial(n):
if n <= 1:
return 1
return n * factorial(n-1)
Divide and Conquer
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)
def merge(left, right):
result = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result.extend(left[i:])
result.extend(right[j:])
return result
print(merge_sort([38, 27, 43, 3, 9, 82, 10]))
Tail Recursion Optimization
def factorial_tail(n, acc=1):
if n <= 1:
return acc
return factorial_tail(n-1, n*acc)
# Trampoline pattern
def trampoline(func, *args):
result = func(*args)
while callable(result):
result = result()
return result
def factorial_trampoline(n, acc=1):
if n <= 1:
return acc
return lambda: factorial_trampoline(n-1, n*acc)
print(trampoline(factorial_trampoline, 1000))
Practice
Implement a recursive solution for the Tower of Hanoi.