原始问题(已解决):假设您可以在一个简化的足球计分系统中得分 {2, 3, 7} 分,那么在给定分数的情况下,您可以通过哪些方式得分?
在此处链接到该问题
我试图围绕这些递归函数在下面的代码中维护分数和结果变量的方式来思考。
代码解决方案(由 ggorlen 提供):
def find_scoring(points, ways_to_score=[2, 3, 7]):
def score_finder(points, scores, result):
if points == 0:
result.append(scores[:])
elif points > 0:
for val in ways_to_score:
scores.append(val)
score_finder(points - val, scores, result)
scores.pop()
return result
return score_finder(points, [], [])
这很好用,完全回答了我原来的问题。但是在阅读了 Elements of Programming Interviews (Python) 中的一些问题后,我决定尝试一下我通过结果和分数列表的方式。我模拟了作者的一项技术,每次递归调用函数时不传递结果列表,而是分配空列表的默认值:
def find_scoring2(points, ways_to_score=[2, 3, 7]):
def score_finder(points, scores, result = []):
if points == 0:
result.append(scores[:])
elif points > 0:
for val in ways_to_score:
scores.append(val)
score_finder(points - val, scores)
scores.pop()
return result
return score_finder(points, [])
这产生了相同的结果,并且这个想法来自 EPI 第 235 页(生成平衡括号)。
然后我决定改变分数变量的创建方式,以摆脱从列表中弹出的需要。我不理解代码,但我再次从同一本书中复制了这个想法。
def find_scoring3(points, ways_to_score=[2, 3, 7]):
def score_finder(points, scores, result = []):
if points == 0:
result.append(scores[:])
elif points > 0:
for val in ways_to_score:
#scores.append(val)
score_finder(points - val, scores + [val])
#scores.pop()
return result
return score_finder(points, [])
所以我的问题是: 1. 我如何围绕每次设置为空列表的结果变量,并且仍然产生正确的解决方案?是否有一些视频或参考资料可以帮助我了解它是如何工作的?2. 为什么当我从追加切换到仅向列表中添加值时,分数变量的行为会发生变化?
慕容3067478
相关分类