algo(计算) -> 会关注计算的步骤数 -> 不同的结构会影响步数
- 线性表(数组,链表)
- 树(树,二叉树)
- 哈希
- 图
与数学思想相关
汉诺塔问题 -> 归纳
数学解法没考虑的 -> 步数,爆栈
- 斐波那契数列
f(0) = 1
f(1) = 1
f(n) = f(n - 1) + f(n - 2)
递归下去会有很多重复计算和stackoverflow
- 循环(迭代)代替递归(解决stackoverflow)
def recsum(x):
if x == 1:
return x
else:
return x + recsum(x - 1)
recsum(5)
5 + recsum(4)
5 + (4 + recsum(3))
5 + (4 + (3 + recsum(2)))
5 + (4 + (3 + (2 + recsum(1))))
5 + (4 + (3 + (2 + 1)))
5 + (4 + (3 + 3))
5 + (4 + 6)
5 + 10
15
循环(迭代)
for i in range(6):
sum += i
尾调用
把结果先算出来,作为参数传到递归里
def tailrecsum(x, running_total=0):
if x == 0:
return running_total
else:
return tailrecsum(x - 1, running_total + x)
前提 写得出来
- 缓存 (减少重复计算)
用个哈希表把计算过的结构缓存