如何解决关于Python递归的一些疑问
它是python的井字游戏,它是一段代码,用于处理用户不要放置无效代码或不尝试在已放置的位置添加X或O的情况。 因此在线视频中的讲师说,您可以使用while循环来检查上面列出的问题,因此我想为什么当用户输入错误时为什么不使用递归,而现在输出中却显示出奇怪的内容
def handle_turn(player):
position=input("Chooes a position from 1 to 9: ")
if position not in ["1","2","3","4","5","6","7","8","9"]:
print("Invalid Choice")
handle_turn(player)
# while position not in ["1","9"]:
# position=input("iNVALID CHOICE Chooes a position from 1 to 9: ")
position=int(position)-1
if board[position]!="_":
print("you cannot go there")
handle_turn(player)
board[position]=player
display_board()
输出:
选择1到9的位置:1
X | _ | _
_ | _ | _
_ | _ | _
从1到9选择一个位置:2
X | O | _
_ | _ | _
_ | _ | _
从1到9选择一个位置:3
X | O | X
_ | _ | _
_ | _ | _
从1到9选择一个位置:1
你不能去那里
从1到9选择一个位置:9
X | O | X
_ | _ | _
_ | _ | O
O | O | X
_ | _ | _
_ | _ | O
从1到9选择一个位置:1
你不能去那里
从1到9选择一个位置:8
O | O | X
_ | _ | _
_ | X | O
X | O | X
_ | _ | _
_ | X | O
解决方法
将handle_turn(player)
替换为return handle_turn(player)
。
说明
为什么这很重要?考虑以下递归函数:
def f(n):
print(' '*n + 'beginning of call {}'.format(n))
if n < 5:
f(n+1)
print(' '*n + 'end of call {}'.format(n))
执行此功能将给出以下输出:
>>> f(0)
beginning of call 0
beginning of call 1
beginning of call 2
beginning of call 3
beginning of call 4
beginning of call 5
end of call 5
end of call 4
end of call 3
end of call 2
end of call 1
end of call 0
如您所见,调用5的执行结束后,流程返回到调用4,该调用执行其剩余的语句print(' '*n + 'end of call {}'.format(n))
;然后流程返回到呼叫3,依此类推。
由于此函数中没有return
语句,因此将执行该函数中的所有语句。在递归调用f(n+1)
之前写的语句在递归调用之前执行,在递归调用之后写的语句在递归调用返回后执行。
对于函数handle_turn
,如果进行了递归调用,则不想执行该函数的其余部分。为防止这种情况发生,您可以在递归调用之后立即添加return语句。考虑:
def g(n):
print(' '*n + 'beginning of call {}'.format(n))
if n < 5:
g(n+1)
return
print(' '*n + 'end of call {}'.format(n))
或等效地:
def g(n):
print(' '*n + 'beginning of call {}'.format(n))
if n < 5:
return g(n+1)
print(' '*n + 'end of call {}'.format(n))
此新功能的输出将是:
>>> g(0)
beginning of call 0
beginning of call 1
beginning of call 2
beginning of call 3
beginning of call 4
beginning of call 5
end of call 5
如您所见,调用0到4的其余语句未执行,因为return
中的if
语句缩短了这些调用的执行时间。
如果您想练习并体验没有return语句的递归函数,并且在递归调用后总是执行所有剩余的语句,我建议您玩一个由递归函数控制的机器人游戏“ RoboZZle”线上。最难的难题大量使用了递归函数的这种行为。
尾递归
在上一段中,我说过一行return g(n+1)
和两行g(n+1) \\ return
是等效的。在大多数语言中,这并不完全正确,因为这两个表达式之一使用 tail recursion ,而另一个表达式则不使用。 Python根本没有尾递归,因此这里的区别并不重要。
一个结果是,您可能会期望大量使用递归的程序在Python中运行缓慢,甚至在某些情况下会崩溃。在您的示例中这不是问题,因为递归取决于用户输入,如果用户是人类,则用户的速度总是比您的程序慢。但是如果用户是另一个程序,则可能会出现问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。