我有一个递归生成器,它会从0到top-1的数字范围内每个组合都产生一遍。以下是代码:
(Try calling it as
我需要的是相同的值,但以不同的顺序排列:我想按它们的最大值排序,即首先是值
生成器不应该产生两次相同的值(当然),并且应该能够使用非常大的值进行调用,例如
我唯一能想到的方法是首先为
有什么想法吗?
def f(width, top):
if width == 0:
yield []
else:
for v in range(top):
for subResult in f(width - 1, top):
yield [ v ] + subResult
如果以 f(3, 3)
调用,则会产生以下值
[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 1, 0], [0, 1, 1], [0, 1, 2],
[0, 2, 0], [0, 2, 1], [0, 2, 2], [1, 0, 0], [1, 0, 1], [1, 0, 2],
[1, 1, 0], [1, 1, 1], [1, 1, 2], [1, 2, 0], [1, 2, 1], [1, 2, 2],
[2, 0, 0], [2, 0, 1], [2, 0, 2], [2, 1, 0], [2, 1, 1], [2, 1, 2],
[2, 2, 0], [2, 2, 1], [2, 2, 2]
(Try calling it as
list(f(3,3))
to get these as a list.)我需要的是相同的值,但以不同的顺序排列:我想按它们的最大值排序,即首先是值
[0, 0, 0]
,然后是所有具有1
作为最大值的值,即[0, 0, 1]、[0, 1, 0]、[0, 1, 1]、[1, 0, 0]...
,然后是包含2
的值,即[0, 0, 2]、[0, 1, 2]、[0, 2, 0]、[0, 2, 1]、[0, 2, 2]、[2, 0, 0]...
等等。生成器不应该产生两次相同的值(当然),并且应该能够使用非常大的值进行调用,例如
f(4,1000)
,然后简单地不要完全排空它(因此,在生成所有值之后根据它们的最大值进行排序是行不通的)。我唯一能想到的方法是首先为
f(w,0)
生成所有值,然后为f(w,1)
和f(w,2)
生成所有值,并始终跳过已经产生的值,但我有一种烦人的感觉,认为可能会有更好的方法:def g(width, top):
for t in range(top):
for v in f(width, t+1):
if t in v:
yield v
有什么想法吗?
g
的实现基本上就是我会做的方式。虽然有办法避免跳过,但增加的复杂性可能不值得。 - Ilmari Karonen