为什么这个解决方案在 Javascript 中有效,但在 Python 中无效? (动态规划)

2023-11-25

我正在学习有关动态编程的教程,并且正在努力在以下问题中实现记忆化:

*写一个函数叫canSum(targetSum, numbers)返回True仅当数组中的数字之和达到目标总和时。数组中的所有数字都是正整数,您可以多次使用它们来求解。

Example:

canSum(7, [2, 4]) -> False因为 2 和 4 相加不能得到 7。*

我的暴力解决方案如下:

def canSum(targetSum, numbers):
    if targetSum == 0:
        return True
    if targetSum < 0:
        return False

    for n in numbers:
        remainder = targetSum - n
        if canSum(remainder, numbers):
            return True

    return False


print(canSum(7, [2, 3])) # True
print(canSum(7, [5, 3, 4, 7])) # True
print(canSum(7, [2, 4])) # False
print(canSum(8, [2, 3, 5])) # True

效果很好,但如果我们记住余数的解决方案,速度会更快(视频中 1:28:03 分钟对此进行了解释)。我用Python做了以下事情,这正是讲师正在做的事情,但它只返回True我不明白为什么......

def canSum(targetSum, numbers, memo={}):
    if targetSum in memo:
        return memo[targetSum]
    if targetSum == 0:
        return True
    if targetSum < 0:
        return False

    for n in numbers:
        remainder = targetSum - n
        if canSum(remainder, numbers, memo):
            memo[targetSum] = True
            return True

    memo[targetSum] = False
    return False


print(canSum(7, [2, 3]))
print(canSum(7, [5, 3, 4, 7]))
print(canSum(7, [2, 4]))
print(canSum(8, [2, 3, 5])) # All of them return True

感谢@Jared Smith 分享的文章,我终于弄清楚了。

该问题是由 python 处理默认参数的方式引起的。来自文章:

在 Python 中,当在函数中传递可变值作为默认参数时,只要该值发生变化,默认参数就会发生变化。

My memo每次调用都会改变字典。所以我只是改变了memo=None并添加了一个检查以查看这是否是该函数的第一次调用:

def canSum(targetSum, numbers, memo=None):
    if memo == None:
        memo = {}

    if targetSum in memo:
        return memo[targetSum]
    if targetSum == 0:
        return True
    if targetSum < 0:
        return False

    for n in numbers:
        remainder = targetSum - n
        if canSum(remainder, numbers, memo):
            memo[targetSum] = True
            return True

    memo[targetSum] = False
    return False


print(canSum(7, [2, 3])) # True
print(canSum(7, [5, 3, 4, 7])) # True
print(canSum(7, [2, 4])) # False
print(canSum(8, [2, 3, 5])) # True
print(canSum(3000, [7, 14])) # False -> Works fast with large inputs!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么这个解决方案在 Javascript 中有效,但在 Python 中无效? (动态规划) 的相关文章

随机推荐

  • 使用 LOAD DATA INFILE 导入 MySQL 表时如何跳过 CSV 文件中的列?

    我有一个包含 11 列的 CSV 文件 还有一个包含 9 列的 MySQL 表 CSV 文件如下所示 col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 MySQL 表如下所示
  • AngularJS 指令嵌入范围= false?

    如何防止使用 transinclude 指令创建新作用域 This jsfiddle由于用红色边框说明的新 范围 我无法绑定任何内容 Html div div
  • 如何递归传递可变引用?

    我正在尝试解决这个问题在铁锈中 这是我的非编译 Rust 代码 use std collections HashMap fn main initialize HashMap let mut fibs HashMap
  • 谷歌脚本错误“您无权调用创建(第38行,文件“宏”)”

    var newSpreadsheet SpreadsheetApp create Spreadsheet to export 我正在运行 Google Sheet 脚本 并且在上面的代码行中收到以下错误消息 知道如何解决这个问题吗 我是新手
  • 作为班级成员持有背景、活动或观点是不好的表现吗?

    我在某处看到红色 将视图保留为活动的成员会降低性能 因为每个视图都保留对其父上下文的引用 并且它将填满堆 这是真的 想象一下这个活动 public class MyActivity extends FragmentActivity priv
  • EPPlus,查找并设置命名范围的值

    我一直在努力尝试使用 ExcelPackage 3 0 1 库设置命名范围 在本例中为单个命名单元格 的值 它应该像这样简单 ExcelNamedRange er xlPackage Workbook Names Customer er V
  • 如何在字典中按原始顺序返回键

    我正在读取一个文件并将信息存储在一个字典中 因为它从上到下读取 与原始文件相比 我不想以错误的顺序打印 另外 一个非常小的问题 我记得在某处看到过 if 和 else 语句的简短形式 if a a a b a c 你知道具体的形式吗 Tha
  • Rails 计算日期范围(以月为单位)

    如何计算两个日期相差几个月 另外 如果它有所不同 我正在使用 Date 对象 而不是 DateTime 另外 一些舍入选项可能会很好 这样我就可以控制是否要对部分月份进行向上或向下舍入 Thanks 从一个日期或日期时间中减去另一个日期或日
  • windows %PATH% 变量 - 如何在“;”上分割再次在 CMD shell 中[重复]

    这个问题在这里已经有答案了 我刚刚检查过堆栈溢出这似乎非常有帮助 并且在 Windows XP 上运行良好 但使用 Windows 7 时 由于某些不明原因 它无法正常工作 The PATH变量看起来像这样 C Program Files
  • 单击按钮时更改选项菜单的选项

    假设我有一个选项菜单network select它有一个要连接的网络列表 import Tkinter as tk choices network one network two network three var tk StringVar
  • python-click:依赖于另一个选项的选项

    这个问题是关于click包 我想设置我的命令 以便一些optional options取决于特定选项值 并且根据其值需要 所需选项 输入 输入文件 doe 整数 代表算法名称 子选项 如果母鹿是 等于1 then option genera
  • 使用QT,如何在一定时间间隔后调用一次函数,即使可能会发生更多调用?

    尽管我认为这个问题没有那么复杂 但我很难用措辞来表达这个问题 我想做类似的事情QTimer singleshot 但我希望它仍然只调用 SLOT 一次 即使QTimer singleshot 在触发之前被多次调用 如果您只想在计时器关闭后调
  • 实施汉恩窗

    我获取传入数据块并将它们通过 fftw 传递以获取一些光谱信息 一切似乎都正常 但我认为我遇到了一些别名问题 我一直在尝试找出如何在我的数据块上实现汉恩窗口 谷歌的例子让我失望了 我应该查看任何想法或链接吗 double dataIn 20
  • 如何在android 2.2中实现拖放?

    我正在尝试开发一个 Android 应用程序 用户应该能够将图像从网格的一个单元格拖动到另一个单元格 为了实现这一点 我需要 Android 3 0 中引入的拖放 API 但我的应用程序应该在 Android 2 2 中运行 那么 有没有办
  • Puppeteer 中主函数和渲染器函数之间的通信

    有没有一种方法可以在 Puppeteer 中的主进程和渲染进程之间进行通信 类似于ipcMain and ipc渲染器功能于Electron 在此演示了一个简单的应用程序post 我发现此功能对于通过触发事件进行调试非常有用page到主要功
  • 如何在每个应用程序启动时运行一次方法?

    嘿 我想知道如何运行一个方法 refreshChannel in an onCreate仅在我的一项活动中出现一次 直到应用程序被终止或重新启动 你可以延长Application并在中运行该方法onCreate您的自定义应用程序类 每次应用
  • 将 .mat 文件从 MATLAB 转换为 OpenCV 中的 cv::Mat 矩阵

    我有一些 MATLAB 代码想要迁移到 OpenCV MATLAB 代码使用的数据存储在 mat 文件中 然后在运行时加载该文件 我将此 mat 文件转换为 csv 文件 然后使用 ifstream 将这些数据作为字符串读入 OpenCV
  • 在 Ruby 中将数组输出到 CSV

    使用 Ruby 将 CSV 文件读入数组很容易 但我找不到任何关于如何将数组写入 CSV 文件的好的文档 谁能告诉我该怎么做 如果重要的话 我正在使用 Ruby 1 9 2 到一个文件 require csv CSV open myfile
  • R 中具有多列的逻辑向量

    我有以下数据框 a b c d e TRUE TRUE FALSE TRUE TRUE FALSE TRUE TRUE TRUE FALSE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE FALSE TR
  • 为什么这个解决方案在 Javascript 中有效,但在 Python 中无效? (动态规划)

    我正在学习有关动态编程的教程 并且正在努力在以下问题中实现记忆化 写一个函数叫canSum targetSum numbers 返回True仅当数组中的数字之和达到目标总和时 数组中的所有数字都是正整数 您可以多次使用它们来求解 Examp