class Stack(object):
def __init__(self,items=[]):
self.stack = items
def is_empty(self):
return not self.stack
def pop(self):
return self.stack.pop()
def push(self,val):
self.stack.append(val)
def __repr__(self):
return "Stack {0}".format(self.stack)
def flip_stack(stack):
def flip_stack_recursive(stack,new_stack=Stack()):
if not stack.is_empty():
new_stack.push(stack.pop())
flip_stack_recursive(stack,new_stack)
return new_stack
return flip_stack_recursive(stack)
s = Stack(range(5))
print s
print flip_stack(s)
のように無添加のオーバーヘッドを持っていないとの条件付きチェックするための例外を使用すると、Pythonで受け入れられた行動であります
収量
Stack [0, 1, 2, 3, 4]
Stack [4, 3, 2, 1, 0]
クロージャがstack
のパラメータをflip_stack
のままにして再帰関数のスコープに入れているという事実を利用して、少し面白くなります。だから、それを内部関数のパラメータにする必要はありません。例えば
def flip_stack(stack):
def flip_stack_recursive(new_stack):
if not stack.is_empty():
new_stack.push(stack.pop())
flip_stack_recursive(new_stack)
return new_stack
return flip_stack_recursive(Stack())
あるいは、再帰関数のすべてのパラメータを取り除くと、あなたのスレッドのスタックフレームはあなたに感謝します:
def flip_stack(stack):
new_stack = Stack()
def flip_stack_recursive():
if not stack.is_empty():
new_stack.push(stack.pop())
flip_stack_recursive()
flip_stack_recursive()
return new_stack
それは再帰的である必要はありますか? –
はい。再帰的でなければならない。 – isal
これは宿題のようなものです。もしそうなら、あなたは '宿題'タグを追加するべきです –