gpt4 book ai didi

python - 修改一个不计数的递归函数。路径,获取所有路径的序列

转载 作者:太空宇宙 更新时间:2023-11-03 16:44:52 24 4
gpt4 key购买 nike

我编写了一个简单的递归 Python 程序来查找字符三角形中的路径数。

顺便说一句,这是解决欧拉计划 P18 的尝试。

triangle = """\
75
95 64
17 47 82
18 35 87 10
20 04 82 47 65
19 01 23 75 03 34
88 02 77 73 07 63 67
99 65 04 28 06 16 70 92
41 41 26 56 83 40 80 70 33
41 48 72 33 47 32 37 16 94 29
53 71 44 65 25 43 91 52 97 51 14
70 11 33 28 77 73 17 78 39 68 17 57
91 71 52 38 17 14 91 43 58 50 27 29 48
63 66 04 68 89 53 67 30 73 16 69 87 40 31
04 62 98 27 23 09 70 98 73 93 38 53 60 04 23"""

grid = triangle.split("\n")
grid[:] = [[int(n) for n in (line.split())] for line in grid]

def find_paths(x,y):

n = 0
if x == 14:
return 1

n += find_paths(x+1,y+1)
n += find_paths(x+1,y)

return n


print find_paths(0, 0)

这成功打印了 16384。但是,我如何修改这个相同的函数来简单地获取例如的所有路径的列表。 [[(0,0),(1,0)...(14,0)],[(0,0),(1,0)...]] ?或者,如果需要太多内存,只需打印每个路径,而不是将它们存储在列表中..

谢谢!

最佳答案

这个想法与你的函数完全相同,只是你返回一个坐标元组,而不是在到达底部时将计数器加 1。通过使其成为生成器,您只需根据需要创建路径。

def generate_paths(depth, x=0, y=0):
if x == depth:
yield ((x, y),)
else:
for path in generate_paths(depth, x+1, y):
yield ((x, y),) + path
for path in generate_paths(depth, x+1, y+1):
yield ((x, y),) + path

示例。

>>> for path in generate_paths(3):
... print(path)

((0, 0), (1, 0), (2, 0), (3, 0))
((0, 0), (1, 0), (2, 0), (3, 1))
((0, 0), (1, 0), (2, 1), (3, 1))
((0, 0), (1, 0), (2, 1), (3, 2))
((0, 0), (1, 1), (2, 1), (3, 1))
((0, 0), (1, 1), (2, 1), (3, 2))
((0, 0), (1, 1), (2, 2), (3, 2))
((0, 0), (1, 1), (2, 2), (3, 3))
>>> print(len(tuple(generate_paths(14))))
16384

这会在不到一秒的时间内生成所有路径。然而,正如问题所暗示的那样,我们鼓励您寻找更有效的方法,因为复杂性是指数级的,并且对于更长的深度,这是不可行的。

关于python - 修改一个不计数的递归函数。路径,获取所有路径的序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36409213/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com