这是一个毫无疑问的问题。这里有:python中的函数输入和递归
我有两个名单,candidates_input和constraint_input。下面的函数通过在constraint_input中给出约束的给定排序,在candidates_input中查找获胜候选者,方法是排除不能成为赢家的候选者,直到剩下一个。因此,我从两个输入列表中删除项目 - 失去了已经告诉他们所有可能的候选项和约束条件,然后转向下一个约束条件。
虽然我不想实际修改原始输入列表,因为我会再次需要它们。但在函数的开头插入这样的事情:
remaining_candidates = candidates_input[:]
remaining_constraints = constraint_input[:]
然后替代函数内旧的这些新名字似乎打破递归。我究竟做错了什么?
def OT_eval(candidates_input, constraint_input): #chooses an optimal candidate given candidates and constraint ranking
constraint = constraint_input[0] #highest ranked constraint
violations_list = [(len(re.findall(constraint, candidate)), candidate) for candidate in candidates_input]
violations_list.sort()
"""
Creating list of (num violations, candidate) duples for each candidate, then sorting on num violations
"""
for pair in violations_list: #checking each candidate against known optimal candidate
if pair[0] > violations_list[0][0]: #num violations > minimal violations
candidates_input.remove(pair[1]) #removing suboptimal candidate
if len(candidates_input) > 1 and len(constraint_input) > 0: #if further constraints needed,
constraint_input.remove(constraint) #remove current constraint and recurse
OT_eval(candidates_input, constraint_input)
elif len(candidates_input) == 1:
optimal_candidate = candidates_input[0]
print "Optimal Candidate: ", optimal_candidate
return optimal_candidate
elif len(candidates_input) > 1 and len(constraint_input) == 0: #more than one candidate left, but no more constraints
raise ValueError("Optimal candidate cannot be determined: check constraints")
呵呵,它现在有效。我不打算最初使用递归,但我的循环不能正常工作。奇怪的是,如果我要求它在返回胜者之前给我candidates_input和constraint_input,它会给我缩短的列表。如果我在函数运行之后要求列出相同的列表,它会为我提供包含所有元素的原始列表。为什么会发生? – Pygmalion