数一数记忆化之后调了几次

数一数记忆化之后调了几次

补全带记忆的 fib,并只在真正计算时把 CALLS 加一(命中缓存不算)。 算 fib(6),输出 CALLS。

阅读更多 →
给斐波那契加上记忆

给斐波那契加上记忆

补全 fib:算之前先查 MEMO,算完之后存进 MEMO。 算 fib(30)——朴素写法这个规模已经很吃力了。

阅读更多 →
⚠️ 记忆化之后只调用几次

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

给斐波那契加上记忆化。运行下面这段程序: CALLS = 0 MEMO = {} def fib(n): global CALLS if n in MEMO: ret

阅读更多 →
什么样的递归值得记忆化

什么样的递归值得记忆化

记忆化只在【0】的时候有用。

阅读更多 →
记忆化在做什么

记忆化在做什么

记忆化(memoization)的做法是【0】。

阅读更多 →
⚠️ 两种写法结果一样,栈深差 5 倍

⚠️ 两种写法结果一样,栈深差 5 倍

把递归版和循环版都写出来,把三样东西拼起来输出(用 / 隔开):两个结果是否相等、递归版的最大深度、循环版的最大深度。

阅读更多 →
把递归斐波那契改成循环

把递归斐波那契改成循环

补全 fib_loop:用循环算第 n 个斐波那契数。 ⚠️ 循环版没有重复计算——这正是它比朴素递归快的原因。

阅读更多 →
把递归阶乘改成循环

把递归阶乘改成循环

补全 fact_loop:用循环算阶乘,不许递归。 算 5 的阶乘。

阅读更多 →
循环版压了几层栈

循环版压了几层栈

运行下面这段程序,它数的是"最深压了几层": MAXD = 0 def fact_loop(n, d): global MAXD if d > MAXD:

阅读更多 →
循环版算出来一样吗

循环版算出来一样吗

运行下面这段程序: def fact(n): if n <= 1: return 1 return n * fact(n - 1) def fact_loop(

阅读更多 →