交付:递归 + 分治 + 记忆化
这是这条路线的最终作品。把阶乘、分治求和求最大、朴素与记忆化斐波那契全写出来,然后一次验完五条: fact(5) 是 120,递归最大深度是 5 分治求和求最大都和内置 sum / max 一致 朴素
阅读更多 →
第四步:加上记忆化
给斐波那契加上记忆化(命中缓存不计数),把 fib(6) 的结果和调用次数拼起来输出。 ——和上一步的 25 次对比一下。
阅读更多 →
第三步:数出递归树的规模
写出带计数的朴素斐波那契,把 fib(6) 的结果和调用次数拼起来输出(结果在前,用 / 隔开)。
阅读更多 →
第二步:写一个分治
写出 dsum(分治求和),和内置 sum 比一比。 一样输出 一致,否则输出 不一致。
阅读更多 →
第一步:写一个带出口的递归
最终作品第一步:写出 fact(阶乘),出口用 <= 而不是 ==。 算 5 的阶乘。
阅读更多 →
这两个分治结果对得上吗
运行下面这段程序: def dsum(a): if len(a) == 0: return 0 if len(a) == 1: return a[0]
阅读更多 →
设计递归解法的顺序
设计一个递归解法,最省事的顺序是【0】。
阅读更多 →
拿到一个新问题,怎么判断能不能递归
判断一个问题适不适合递归,先问【0】。
阅读更多 →
记忆化不能改变结果
把朴素版和记忆化版都写出来,比较两者对 fib(20) 的结果。 一样输出 结果一致,否则输出 结果不一致。
阅读更多 →
⚠️ 记忆化到底省了多少
把朴素版和记忆化版都写出来(各自带一个计数器),算 fib(20),把两个调用次数拼起来输出(朴素在前)。
阅读更多 →