⚠️ 记忆化之后只调用几次
给斐波那契加上记忆化。运行下面这段程序: CALLS = 0 MEMO = {} def fib(n): global CALLS if n in MEMO: return MEMO[n] CALL
给斐波那契加上记忆
补全 fib:算之前先查 MEMO,算完之后存进 MEMO。 算 fib(30)——朴素写法这个规模已经很吃力了。
数一数记忆化之后调了几次
补全带记忆的 fib,并只在真正计算时把 CALLS 加一(命中缓存不算)。 算 fib(6),输出 CALLS。
⚠️ 记忆化到底省了多少
把朴素版和记忆化版都写出来(各自带一个计数器),算 fib(20),把两个调用次数拼起来输出(朴素在前)。
记忆化不能改变结果
把朴素版和记忆化版都写出来,比较两者对 fib(20) 的结果。 一样输出 结果一致,否则输出 结果不一致。
拿到一个新问题,怎么判断能不能递归
判断一个问题适不适合递归,先问【0】。
设计递归解法的顺序
设计一个递归解法,最省事的顺序是【0】。
这两个分治结果对得上吗
运行下面这段程序: def dsum(a): if len(a) == 0: return 0 if len(a) == 1: return a[0] m = len(a) // 2
第一步:写一个带出口的递归
最终作品第一步:写出 fact(阶乘),出口用 <= 而不是 ==。 算 5 的阶乘。
第二步:写一个分治
写出 dsum(分治求和),和内置 sum 比一比。 一样输出 一致,否则输出 不一致。