我正在使用递归函数来创建通过迷宫的流路径。该函数返回正确的路径元组(row,col),但我需要以元组列表的形式。例如,我需要创建此表单
[(0,0),(1,1),(2,2),(3,3),(4,3)]
但是该函数返回:
[(0, 0), [(1, 1), [(2, 2), [(3, 3), (4, 3)]]]]
这是功能:
def FlowPathAt(fdir,row,col):
lItem = FlowOut(fdir,row,col)
if not lItem:
return (row,col)
else:
r,c = lItem
return [(row,col) , FlowPathAt(fdir,r,c)]
FlowOut(fdir,row,col)
是一个函数,它返回从(row,col)开始的下一个单元格地址
有没有办法在构建期间压扁此列表?
答案 0 :(得分:6)
试试这个:
def FlowPathAt(fdir,row,col):
lItem = FlowOut(fdir,row,col)
if not lItem:
return [(row,col)] # More convenient base case
else:
r,c = lItem
return [(row,col)] + FlowPathAt(fdir,r,c) # Append list to list instead of nesting
(这总是返回一个元组列表,这似乎比有时返回一个列表更好的想法,有时返回一个元组。如果这是不可接受的,你需要做一些后处理。)
答案 1 :(得分:4)
为列表增长提供了很多内存管理,为什么不将它重构为生成器函数:
def FlowPathAt(fdir, row, col):
while True:
yield row, col
lItem = FlowOut(fdir, row, col)
if lItem is None: break
row, col = lItem