【发布时间】:2016-11-29 20:44:53
【问题描述】:
我的计划目标如下:
给定任何形状(表示为枚举点及其与其他点的连接),返回一个包含所有可能路径的列表(作为字符串/列表/...)。路径是给定形状的“绘图”,其中:
以下代码基本上是我到目前为止所提出的。这不是实际程序的代码,但基本语义是相同的(即如果这段代码可以工作,我的程序也可以工作)。
"""
Example used:
2
/ \
/ \
/ \
1-------3
"""
from copy import deepcopy
points = {1: [2,3],
2: [1,3],
3: [1,2]}
def find_paths(prev_point, points):
for current_point in points[prev_point]:
points[current_point].remove(prev_point)
points[prev_point].remove(current_point)
return [prev_point] + find_paths(current_point, points)
return [prev_point]
def collect(points):
results = []
for first_point in points:
result = find_paths(first_point, deepcopy(points))
results.append(result)
return results
print(collect(points))
我一直在努力让它返回所有路径。到目前为止,它只列出了 3 个(共 6 个)。我确实知道问题是由于f 中的for-loop 每次被调用时只执行一次(并且它被调用3 次),因为每次执行都由return 终止。但是,到目前为止,我一直未能找到避免这种情况的方法 - 我尝试将 f 设为生成器,但这给了我一个生成器列表作为最终结果,无论我如何尝试更改它。
感谢您的帮助!
编辑:生成器版本我只是用yield s 替换了find_paths 中的returns。
所以最后两行看起来像:
...
yield [prev_point] + find_paths(current_point, points)
yield [prev_point]
此外,我为生成器使用了一个“扁平化器”,但它根本不起作用:
def flatten(x):
if callable(x):
for i in x:
yield flatten(i)
yield x
定义函数(): 产量 1 lis = [1,2,func]
对于 f in flatten(lis): 打印(f)
【问题讨论】:
-
如果这不是家庭作业,你确定没有图书馆可以做这个吗?如果是家庭作业,那么实际上提供你迄今为止所做的工作并提出比“你能为我做这个”更好的问题。
-
for current_point in points[prev_point]:... points[prev_point].remove(current_point)迭代时不要从其中删除。我建议复制一份:for current_point in points[prev_point][:]。其次,您使用生成器的想法听起来不错,向我们展示代码,我们将告诉您如何修复它。但首先尝试简单地将生成器转换为列表,这很容易。 -
我看到的一个问题是您的递归
find_paths函数没有“结束条件”。您需要知道何时停止。此外,您的 find_paths 无法返回“多条路径”,这似乎是预期的。 -
@daveydave400 Tbh 我没有寻找图书馆,因为我想自己做一个空闲时间项目(不是为了学校;))另外,我认为你的意思是
return [prev_point],如果points字典为“空”则运行。 -
如果您正在四处寻找有关此问题的信息,它看起来像是柯尼斯堡七桥的变体
标签: python generator nodes graph-theory