我正在做一个项目,它使用一个简单的堆栈,并在该堆栈上进行操作。你知道吗
操作包括:
NoOp # Do nothing, leave stack as-is
Push(i) # Push value i onto stack
Pop(i) # Pop top value of stack, raise if popped value != i or stack is empty
我有一个函数,它接受这些指令的序列,并从空堆栈开始按顺序执行它们。然后返回最后一个堆栈。在我的例子中,返回空堆栈的序列被认为是格式良好的。你知道吗
形成良好的序列示例:
() # The empty sequence
NoOp
Push(x), Pop(x)
Push(x), NoOp, NoOp, NoOp, Pop(x), NoOp # NoOps are OK sprinkled anywhere
Push(x), Push(y), Pop(y), Pop(x) # Nesting is OK
非格式良好序列的示例:
Push(x) # Does not leave an empty stack
Pop(x) # Attempt to pop from empty stack
Push(x), Push(y), Pop(x), Pop(y) # Improper nesting, Pop(x) will get y and error
出于测试目的,我希望能够为给定的最大长度N生成所有格式良好的指令序列。有没有一种方法可以使用itertools来实现这一点,而不必生成所有序列排列并过滤掉无效的序列?你知道吗
所以,多亏了Stef的回答,我才能够构建一个工作完美的生成器方法。你知道吗
好的,我们可以通过递归来实现。你知道吗
基本情况是如果没有元素。你知道吗
如果我们看看可能的模式,我们可以看到,所有的情况下,要么开始与NoOps或推。你知道吗
根据这些想法,我们可以得出以下算法。你知道吗
对于N=4,它将返回:
NoOp,NoOp,NoOp,NoOp,
NoOp,NoOp,按(0),弹出(0),
NoOp,按(1),弹出(1),NoOp,
NoOp,Push(2),NoOp,Pop(2),
按(4),弹出(4),NoOp,NoOp,
按(5),弹出(5),按(3),弹出(3),
按(6),NoOp,Pop(6),NoOp,
按(8),NoOp,NoOp,Pop(8),
按(9),按(7),弹出(7),弹出(9),
编辑-用于获取0…N的所有结果
我想有人想说的是,您可能不仅希望返回N的结果,还希望返回0…N的结果。添加以下行:
在return语句之前。对于N==2,它将返回:
NoOp,NoOp,
不,
按(0),弹出(0),
不,
“”
相关问题 更多 >
编程相关推荐