⚠️ 记忆化之后只调用几次

给斐波那契加上记忆化。运行下面这段程序: 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 比一比。 一样输出 一致,否则输出 不一致。

开始练习 →