【问题标题】:Memoization and return statements记忆和返回语句
【发布时间】:2021-03-18 15:26:34
【问题描述】:

我对 python 还很陌生,偶然发现了 youtube 上的动态编程课程,我认为这可以帮助我更好地理解这个概念 @here

现在,我一直在努力理解它......有人有时间解释这段代码的工作方式吗?

该函数将目标总和和一个数字数组作为参数。 该函数应返回一个数组,其中包含与目标数字相加的任意数字组合。

def howSum(targetSum, numbers, memo = {}):

if targetSum in memo : return memo[targetSum]
if targetSum == 0 : return []
if targetSum < 0 : return None

for num in numbers:
    remainder = targetSum - num
    
    remainderResult = howSum(remainder, numbers, memo)
        
    if remainderResult != None:
        memo[targetSum] = [*remainderResult, num]
        return memo[targetSum]
    
memo[targetSum] = None
return None
    

原始代码是为 JS 编写的,我将其翻译成 Python,但我遇到了两件事:即:

  • 在定义结束时返回语句

  • 特别是这一行:

    memo[targetSum] = [*remainderResult, num]

有没有我遗漏的概念?

【问题讨论】:

    标签: python return memoization


    【解决方案1】:

    我试着用cmets来解释:

    def howSum(targetSum, numbers, memo = {}):
    
        # if the result is calculated 
        # already (in the past) then 
        # use it
        if targetSum in memo : return memo[targetSum]
    
        # return pre-defined values 
        # to out-of-bound parameters
        if targetSum == 0 : return []
        if targetSum < 0 : return None
    
        # otherwise make the calculation
        for num in numbers:
            remainder = targetSum - num
            
            remainderResult = howSum(remainder, numbers, memo)
                
            if remainderResult != None:
                # if there is a result (which is not 
                # None) then store it for later
                # (to memoize it)
                memo[targetSum] = [*remainderResult, num]
                return memo[targetSum]
        
        memo[targetSum] = None
        return None
    

    如需更 Pythonic 的记忆,请参阅 this answer

    【讨论】:

    • 感谢您的链接。是时候多学习一点了
    • 如果你觉得它有用,请考虑点赞:)
    【解决方案2】:

    最好简短地提及您的代码应该评估的函数以节省其他人的时间。

    1. 在定义结束时返回语句:

    注意,如果你在执行代码时到达了这一行,那么你没有找到答案,所以返回None,这意味着没有找到答案。

    1. memo[targetSum] = [*remainderResult, num]

    您的函数试图找到一种方法将 targetSum 写为数字元素子集的总和,并将这些元素存储在 memo[targetSum] 中。这正是这行代码中发生的事情。

    【讨论】:

    • 谢谢您,我已根据您的评论编辑了帖子。
    猜你喜欢
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 2010-10-30
    • 1970-01-01
    • 2021-12-05
    • 2020-04-03
    • 1970-01-01
    相关资源
    最近更新 更多