gpt4 book ai didi

python - python中的自调用函数

转载 作者:太空宇宙 更新时间:2023-11-03 13:43:26 25 4
gpt4 key购买 nike

假设我正在尝试用 Python 制作 BattleShip 游戏。我有一个名为 board 的列表列表。 board 中的每个列表都是该行中的空格列表,对于本例,它将是 5x5:

[['clear', 'clear', 'clear', 'clear', 'clear'],
['clear', 'clear', 'clear', 'clear', 'clear'],
['clear', 'clear', 'clear', 'clear', 'clear'],
['clear', 'clear', 'clear', 'clear', 'clear'],
['clear', 'clear', 'clear', 'clear', 'clear']]

我想创建一个函数来返回板上的随机空白空间。

def pl_point(board):
place = [randrange(0,5),randrange(0,5)] #heh, found out these aren't inclusive.
if board[place[0]][place[1]] == "clear": return place
else:
return pl_point() #calls itself until a clear place is found

这是我的问题:让一个函数调用自身直到它获得它想要的值(即使棋盘几乎被填满)是否效率低下?有没有更好的方法我应该这样做?

我不知道如何使用 while 语句,因为该语句在赋值之前总是引用“place”,而且我想不出任何不引用 out 的 place 值-超出范围或未分配的“板”值。

如果这是一个重复的主题,我很抱歉,我试图找到一个类似的但找不到。这也是我第一次使用这个网站提出问题而不是回答问题。

最佳答案

Is it inefficient to have a function call itself until it gets the value it wants (even if the board is almost entirely filled)? Is there a better way I should do this instead?

是的,是的。但真正的问题并不是效率低下,而是如果您不幸需要尝试 1000 次,您的程序将因递归错误而失败。

I couldn't figure out how to use a while statement with this because the statement would always reference 'place' before it was assigned, and I couldn't think of any value for place that wouldn't reference an out-of-range or unassigned 'board' value.

只需使用while True:,您就可以breakreturn 来跳出循环:

while True:
place = [randrange(0,4),randrange(0,4)] #randrange is inclusive
if board[place[0]][place[1]] == "clear":
return place

作为旁注,正如 inspectorG4dget 在评论中指出的那样,randrange包容性的;这只会返回数字 0123

此外,将 x 和 y 坐标放入一个列表中,以便您可以重复使用 [0][1] 会使内容更难阅读。只需使用 x, y = [randrange(5), randrange(5)](同时解决其他问题),然后使用 board[x][y],然后返回 x, y


如果这太慢了,那么是的,有一个更优化的方法来做到这一点。首先列出所有空位,然后随机选择一个:

clearslots = [(x, y) for x in range(5) for y in range(5) if board[x][y] == "clear"]
return random.choice(clearslots)

当棋盘大部分是空的时候,这可能会更慢,但当棋盘被填满时,它不会变得更糟。此外,与您的方法不同,它保证了最坏情况下的恒定时间;例行程序需要数年时间,而不是极不可能,这是不可能的。

如果你不理解那个列表理解,让我更明确地写出来:

clearslots = []
for x in range(5):
for y in range(5):
if board[x][y] == "clear":
clearslots.append((x, y))

关于python - python中的自调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25319895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com