我有这个代码,它不是我的,我在网上看到它,我想知道递归是如何工作的,有人可以解释一下!
(这个函数接受一个整数列表(距离)和一个值' 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
我希望我清楚自己
答案 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
中的distances0
与distances
相似但没有元素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