1

我有一个完全按照我想要的方式工作的函数,但是对于我的课程工作,我必须把这个函数变成一个类:

  • 必须有一个名为solveIt,
  • 返回以下两个值:
    • 如果您已解决此背包问题,则为 True 的布尔值,并且
    • 具有正确值的背包对象。

该类必须有一个__str__()返回这样的字符串的函数。第一行是大小,第二行是逗号分隔的元素列表:

10
4,1,9,2,0,4,4,4,3,7

我不太了解课程,因此将不胜感激。这是我现在拥有的功能:

from itertools import combinations

def com_subset_sum(seq, target):
    if target == 0 or target in seq:
        print(target)
        return True

    for r in range(len(seq),1,-1):
        for subset in combinations(seq, r):
            if sum(subset) == target:
                print(subset)
                return True
    return False

print(com_subset_sum([4,1,9,2,0,4,4,4,3,7],10))
4

1 回答 1

1

将函数转换为类的一种明显方法是将函数参数(或其中一些参数)转换为对象属性。例如:

class Knapsack(object):
    def __init__(self, seq, target):
        self.seq = seq
        self.target = target
        self.solution = None
    def solveIt(self):
        if self.target == 0 or self.target in self.seq:
            self.solution = (target,)
            return True, self.solution
        for r in range(len(self.seq),1,-1):
            for subset in combinations(self.seq, r):
                if sum(subset) == self.target:
                   self.solution = subset
                   return True, self.solution
        return False, ()

现在你可以这样做:

>>> knapsack = Knapsack([4,1,9,2,0,4,4,4,3,7],10)
>>> print(knapsack.solveIt())
(True, (4, 1, 2, 0, 3))

然后,添加一个__str__方法很简单:

def __str__(self):
    if self.solution is None:
        self.solveIt()
    return '{}\n{}'.format(len(self.seq), 
                           ','.join(map(str, self.solution)))

我添加的原因self.solution是,一遍又一遍地调用__str__不会一遍又一遍地计算结果。您可以轻松地删除该成员并编写以下内容:

def __str__(self):
    solved, solution = self.solveIt()
    return '{}\n{}'.format(len(self.seq), 
                           ','.join(map(str, solution)))

无论哪种方式,我都不确定这比功能更好。(事实上​​,更糟糕的是:使用函数,您始终可以使用functools.partial绑定仅序列,或序列和目标,或者当然两者都不绑定,而使用类,您总是必须绑定两者.)

也许你的教授给了你一些关于你想如何使用这个可能有帮助的对象的提示?或者,也许你的教授只是个白痴,不知道如何想出一个很好的激励性任务来教你上课……</p>

于 2013-04-18T00:50:06.977 回答