Python 如何打印函数输出的第n行
如何打印输出“a”的第n行?我试着切“a”,但没用。我似乎也不能重复“a”Python 如何打印函数输出的第n行,python,recursion,slice,Python,Recursion,Slice,如何打印输出“a”的第n行?我试着切“a”,但没用。我似乎也不能重复“a” A = [1,2,3] B = [] C = [] def move(n, pegA, pegB, pegC): if n > 0: move(n - 1, pegA, pegC, pegB) target.append(pegA.pop()) print(len(A), len(B), len(C)) move(n - 1, pegC, p
A = [1,2,3]
B = []
C = []
def move(n, pegA, pegB, pegC):
if n > 0:
move(n - 1, pegA, pegC, pegB)
target.append(pegA.pop())
print(len(A), len(B), len(C))
move(n - 1, pegC, pegB, pegA)
a = move(3, A, C, B)
a返回以下输出:
2 0 1
1 1 1
1 2 0
0 2 1
1 1 1
1 0 2
0 0 3
我想能够打印第二行,这是1。我应该重新构造函数“move”吗?以
move
的方式构造的函数不会保留它打印的输出的任何记录,而且很难恢复。如果需要按索引查找输出行,则可以返回包含每行输出的列表,如下所示:
def move(n, pegA, pegB, pegC, output_lines=None):
if output_lines is None:
output_lines = []
if n > 0:
move(n - 1, pegA, pegC, pegB, output_lines)
target.append(source.pop())
output_lines.append('%d %d %d' % (len(A), len(B), len(C)))
move(n - 1, pegC, pegB, pegA, output_lines)
return output_lines
a = move(3, A, C, B)
# print all lines of output
print('\n'.join(a))
# print 2nd line
print(a[1])
您是否尝试过将输出保存在列表中并从中打印所需的位置。@manasdash我将其称为python中的反模式。只要让步,让消费者决定是否接受这个建议@user633183@user633183:我同意
yield
可能是生产代码的最佳选择,但在我看来这不像生产代码。我认为简洁和易于理解比性能和程序体系结构最佳实践更重要,对于OP和将来看到这个问题的人来说。@lehiester这不是性能问题;这是一个能够以任何方式使用结果而不是打印结果的问题……我会建议更优雅的解决方案,实际使用返回值,而不是忽略它们。让输入参数像一个全局函数一样运行感觉很奇怪。@Mad Physician:我不知道有什么方法可以连接每个递归调用的输出,而不使其比O(n)更糟糕,但也许有一种方法。“我同意这很难看。”莱希斯特说。“是的,总是有不必要的内存崩溃。”物理学家,我相信这是最好的解决方案。我想不出一种方法,可以在递归函数中仅使用return
s.@Tomothy将其附加到“running total”列表中。您可以按照与通话相同的顺序扩展列表。问题在于,它一路上制造了大量不必要的副本,而不是正常的摊销附件。