Python代码使用递归函数计算允许的最大行李量

Python代码使用递归函数计算允许的最大行李量,python,python-2.7,function,recursion,count,Python,Python 2.7,Function,Recursion,Count,我是python新手,我有一个任务,我需要编写一个递归函数,它包含两个参数权重,W,Weights是行李的重量列表,W是学生可以携带的最大重量,在python 2.7中,它计算学生可以携带的最大行李量,并且不超过最大限制W,例如: >>> calc_max_baggage([5], 0) >>> 0 >>> calc_max_baggage ([1, 1, 1], 5) >>> 3 >>> calc_max

我是python新手,我有一个任务,我需要编写一个递归函数,它包含两个参数权重,W,Weights是行李的重量列表,W是学生可以携带的最大重量,在python 2.7中,它计算学生可以携带的最大行李量,并且不超过最大限制W,例如:

>>> calc_max_baggage([5], 0)
>>> 0
>>> calc_max_baggage ([1, 1, 1], 5)
>>> 3
>>> calc_max_baggage([4, 2, 3, 1], 5)
>>> 2
这是我的代码,但它返回错误:

def calc_max_baggage (weights, W):
weights = []
res = []
W = int
def number_of_index(weights, W, i): 
    if max(weights) > W:
        return res
    else:
        count += i in weights

return calc_max_baggage()
错误消息:

回溯最近一次呼叫上次: 文件,第1行,在 计算最大行李量[5],0 文件C:/Users/user/Desktop/לייייפיתיןPython/עבית/ex6/test(ex6.py,第12行,在calc(u max)u行李中 返回计算最大行李 TypeError:calc_max_baggage只接受给定的2个参数0

我完全不确定我的代码我认为它完全错了

权重是权重列表,W是最大权重。 鉴于此,我想知道weights[]列表中有多少项可以带上飞机。 *我无法更改函数calc_max_baggageweights,这需要两个参数

W也可以是负数,在这种情况下,函数返回0

它必须只使用递归而不使用循环来解决


谢谢

我们可以从中稍微修改powerset配方,以避免使用显式循环:

from itertools import chain, combinations

def powerset(iterable):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = list(iterable)
    return chain.from_iterable(map(lambda r: combinations(s, r), range(len(s)+1)))
对于每种行李组合,我们可以过滤掉所有超过最大重量的行李,然后选择物品最多的一件:

def calc_max_baggage(weights, W):
    weights = powerset(weights)
    filtered = filter(lambda items: sum(items) <= W, weights)
    filtered = chain(filtered, ((),)) 
    return max(filtered, key=len)
如果需要递归组件,可以递归地定义powerset,但效率明显较低

def powerset(seq):
    if not seq:
        return ((),)
    else:
        head, *tail = seq
        tail_pow = powerset(tail)
        with_head = tuple(map(lambda t: (head,) + t, tail_pow))
        return with_head + tail_pow

到目前为止你试过什么?请发布您的代码。我编辑了上面的文章。您需要使用两个参数调用函数。您的答案是正确的,但我必须使用递归来解决问题,并且不使用任何循环。此代码不使用任何显式循环。可能有一种递归的方法来定义powerset,但我不知道该怎么做。@Thaa'erSawaid看到我的编辑。在提交此作业之前,您可能需要仔细阅读作业。我正在自由地使用map来绕过no-loops要求。
def powerset(seq):
    if not seq:
        return ((),)
    else:
        head, *tail = seq
        tail_pow = powerset(tail)
        with_head = tuple(map(lambda t: (head,) + t, tail_pow))
        return with_head + tail_pow