递归在这段代码中的确切程度

时间:2018-05-13 20:23:56

标签: python

我有这个代码,它不是我的,我在网上看到它,我想知道递归是如何工作的,有人可以解释一下!

(这个函数接受一个整数列表(距离)和一个值' r'让我们说10)它返回我们如何使用距离达到100的所有可能性)让我们说清单是[3,5,2,5]r的值为10!为了使10我们需要[5,5][3,2,5],这就是代码:

def greedy(r, distances):
if r < 0:
    return []
if r == 0:
    return [[]]
solutions = []
for last_distance in d:
    combos = greedy(r - last_distance, d)
    for combo in combos:
        combo.append(last_distance)
        if(not solutions.__contains__(combo)):
            solutions.append(combo)
return solutions

我希望我清楚自己

2 个答案:

答案 0 :(得分:0)

我建议使用python打印功能

print("")

在多个位置实际看到递归发生。你会得到一个比试图向你解释它的人更好的想法。

虽然功能本身很简单。对于距离中的每个元素,该函数从所需的r值中减去该元素,并使用if条件检查该值。 如果r值为零,即对于距离中的某些元素,它们的总和为r,则返回一个多列表,其中还包含所述元素。

最后,总和添加到r的元素的完整列表会附加到solution列表并返回。

答案 1 :(得分:0)

假设给定长度为distances0的列表n,您可以从列表中返回所有元组i1,..,in,对于任何数字r总和r {1}}。

您希望对长度为distances的列表n+1执行相同的操作。 由于您知道如何为大小为n的列表解决问题,因此您将执行以下操作:对于last_distance的每个元素distances,返回所有归结的元组i1,...,in列表r-last_distance中的distances0distances相似但没有元素last_distance(因此长度为n)。

我认为代码中可能存在一些错误,这里应该是一个工作版本:

def greedy(r, distances):
    if r < 0:
        return []
    if r == 0:
        return [[]]
    solutions = []
    for i in range(len(distances)):
        d = distances[:i]+distances[i+1:]
        last_distance = distances[i]
        combos = greedy(r - last_distance, d)
        for combo in combos:
            combo.append(last_distance)
            if(not solutions.__contains__(combo)):
                solutions.append(combo)
    return solutions