neighbors = {0: [8],
1: [2,4],
2: [1,4,3],
3: [2,6],
4: [1,5,7],
5: [2,4,6,8],
6: [3,5,9],
7: [4,8],
8: [7,5,9,0],
9: [6,8]}
def get_sequences(n):
if not n:
return
stack = [(i,) for i in range(10)]
while stack:
cur = stack.pop()
if len(cur) == n:
yield cur
else:
stack.extend(cur + (d, ) for d in neighbors[cur[-1]])
print list(get_sequences(3))
递归在这里并不是什么大问题,因为序列相对较短,除了第一个数字外,每个数字的选择也相对较短,因此似乎“只有”4790个不允许使用对角线的可能性。这是作为迭代器编写的,以消除创建和返回包含所有可能的大型容器的需要。在
我突然想到,在数据结构中存储邻居邻接信息的数据驱动方法的另一个好处是,除了容易支持不同的小键盘之外,它还使得控制对角线是否被允许变得微不足道。在
我简短地讨论了是否将其列为一个列表而不是一个字典,以便更快地查找,但我意识到这样做会使生成除数字以外的序列变得更困难(而且可能也不会使它更快)。在
试试这个。在
这将产生所有可能的序列。你没有提到你是否想要有循环的,比如
^{pr2}$(0, 8, 9, 8)
,所以我把它们留在了里面。如果你不想要,那就用请注意,我为
0
创建了一个包含一个元素的列表,而不是一个整数。这是为了保持一致性。很高兴能在字典里查到索引,知道你会得到一个列表。在还要注意,这不是递归的。递归函数在正确支持递归函数的语言中是非常好的。在Python中,您几乎应该像我在这里演示的那样管理堆栈。它就像递归解决方案一样简单,并避开函数调用开销(python不支持尾部递归)和最大递归深度问题。在
我还忍不住注意到,在您的示例中,没有一个数字被重用。如果您希望这样做,那么可以使用
unique_digits = True
选项;这将不允许对已经使用的数字进行递归。在+1多有趣的拼图。我希望这对你有用!在
^{pr2}$相关问题 更多 >
编程相关推荐