python - 在 python 中使用字典进行动态绑定(bind)?

标签 python recursion dictionary dynamic-programming fibonacci

我知道如何递归地计算斐波那契数列,这非常简单:

def F(n):
  if n == 1 or n == 2:
    return 1
  else:
    return k * F(n-2) + F(n - 1)

但是我确实知道这是极其低效的,因为它必须一次又一次地计算相同的值。解决这个问题的方法是在进行过程中以某种方式存储值。假设您想要第 20 个值。一旦计算出 F(13) 是什么,就可以直接存储和调用它的值,而不是通过所有递归级别来获得相同的答案。

字典是这个问题的一个明显的解决方案。然而,我的答案涉及字典不起作用。

U = {1:1, 2:1}
def F(n):
  global U
  if n in U:
    return U[n]
  else:
    U[n] = F(n - 2) + F(n - 1)

运行此代码后,只需打印 U[n]。

我已经多次运行该逻辑,一切看起来都很好,但我不断收到此错误:

TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'

每当我尝试大于 3 的数字时。我不知道如何返回 None,但我承认我可能错过了导致问题的字典的某种细微差别。

最佳答案

else 子句中缺少 return 语句。

def F(n):
  global U
  if n in U:
    return U[n]
  else:
    U[n] = F(n - 2) + F(n - 1)
    return U[n]

或简化:

def F(n):
  if n not in U:
    U[n] = F(n - 2) + F(n - 1)
  return U[n]

(不需要全局。)

关于python - 在 python 中使用字典进行动态绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16600761/

相关文章:

c# - 如何在 C# 中复制 Python 的排序内置函数的行为?

python - 无法在 Python 中获取重定向的 URL。尝试使用 requests、urllib、urllib2 和 mechanize

haskell - 如何使用等式推理证明此 Haskell 代码

java - 十二进制递归将整数转换为字符串

Swift 按值对字典进行排序

python - 如何将 MongoDB 中的 JSON 插入的created_at字段转换为Python中的日期时间对象

c - 涉及静态局部变量的递归函数中的意外输出

根据条件快速选择特定值

基于公共(public)键合并 2 个字典列表的 Pythonic 方法

python - 如何在Django、Python中异步显示图片?