涵俊教编程(一)递归
2018, Jun 04
讨论:什么是递归?
引出两个重要的概念:
-
Boundary Case 结束条件
-
Recursion Equation 递归式
应用(一)n!
f(n) = n * f(n-1)
n = 0, f(n) = 1
应用(二)C(n,k)
C(n,k) = C(n-1,k) + C(n-1,k-1)
n = 0, C(n,k) = 1
k = 0, C(n,k) = 1
k = 1, C(n,k) = n
k = n, C(n,k) = 1
应用(三)斐波那契数列
f(n) = f(n-1) + f(n-2)
n = 0, f(n) = 1
n = 1, f(n) = 1
时间复杂度
答案
O(n) = 1 + O(n-1)
O(n) = O(n-1) + O(n-2) + 1
- 规模(数值)上大于斐波那契数列本身
练习:写出递推法求斐波那契数列第 n 项的 Python 函数
def f(n):
if n == 0 or n == 1:
return 1
else:
return f(n-1) + f(n-2)
思考:有没有更优的方法?
L = [1,1]
for i in range(0, n-2):
L.append(L[i]+L[i+1])
print(L[n-1])
总结
作业
用上述三种方法完成 C(n,k) 和斐波那契数列第 n 项的计算