【问题标题】:Binomial coefficient in python using memoizationpython中使用memoization的二项式系数
【发布时间】:2020-06-16 10:52:04
【问题描述】:
def c_b(n, k):
    memo = {}

    if n == 0:
        return 0
    if k == 0:
        return 1
    try:
        return memo[n,k]
    except KeyError:
        memo[n, k] = c_b(n-1, k) + c_b(n-1, k-1)
        return memo[n, k]

我想知道为什么这段代码不能正常工作我没有得到任何异常/错误只是一些错误的数字结果,例如 4 而不是 10

【问题讨论】:

  • 欢迎来到 Stack Overflow!请正确格式化您的代码,click here to learn how
  • 您能否详细说明您的代码“不起作用”的原因?你期待什么,实际发生了什么?如果您遇到异常/错误,请发布它发生的行以及可以使用minimal reproducible example 完成的异常/错误详细信息。请edit您的问题将这些详细信息添加到其中,否则我们可能无法提供帮助。
  • @БогданОпир 我没有得到任何异常/错误,只是一些错误的数字结果,例如 4 而不是 10。
  • memo = {} 每次调用此函数时都会将memo 重置为空字典。
  • 您应该了解什么是局部变量,并学习 OOP 基础知识。您可以使用 globalnonlocal 关键字作为快捷方式。

标签: python-3.x


【解决方案1】:

函数内部创建的变量在每次函数执行后都会被删除,即使没有,它们也会在你的情况下被覆盖。这是针对您的情况的快速修复,使用 global 关键字:

memo = {}

def c_b(n, k):
    global memo

    if n == 0:
        return 0
    if k == 0:
        return 1
    try:
        return memo[n,k]
    except KeyError:
        memo[n, k] = c_b(n-1, k) + c_b(n-1, k-1)
        return memo[n, k]

即使它应该可以正常工作,但当涉及到应该可靠、可开发甚至可读的代码时,切勿使用它。对于这些情况,应该使用基本的 OOP:

class Cb: #  created class [type of objects]
    def __init__(self): #  initialization, runs on object creation
        self.memo = {}

    def c_b(self, n, k): #  in this case, self=cb
        if n == 0:
            return 0
        if k == 0:
            return 1
        try:
            return self.memo[n,k]
        except KeyError:
            self.memo[n, k] = self.c_b(n-1, k) + self.c_b(n-1, k-1)
            return self.memo[n, k]

n,k = int(input('n: ')), int(input('k: '))
cb = Cb() #  created new object (cb) of class Cb
result = cb.c_b(n, k) #  called a method c_b of object cb
print(result)

希望对您有所帮助!

【讨论】:

    猜你喜欢
    • 2018-02-22
    • 2018-07-05
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    相关资源
    最近更新 更多