gpt4 book ai didi

python - Python 中的无限递归

转载 作者:行者123 更新时间:2023-11-28 19:59:56 25 4
gpt4 key购买 nike

完全公开,这是家庭作业的一部分(虽然是一小段,但项目本身是一个玩游戏的 AI)。

我在树节点类中内置了这个函数:

    def recursive_score_calc(self):
current_score = self.board
for c in self.children:
child_score = c.recursive_score_calc()
if(turn_color == 1):
if(child_score > current_score):
current_score = child_score
else:
if(child_score < current_score):
current_score = child_score
self.recursive_score = current_score
return current_score

在深度为 1 的树(一个根和一些子节点)上,它已经达到 Python 递归限制。该函数旨在使用动态规划自下而上构建最小-最大树。老实说,我不知道为什么这没有按预期工作,但我也是 Python 的新手。

Stack Overflow 的好心人:为什么这段代码会给我一个 stack overflow?

有问题的整个类(class):

from Numeric import *

class TreeNode:
children = []
numChildren = 0
board = zeros([8,8], Int)
turn_color = 0 # signifies NEXT to act
board_score = 0 # tally together board items
recursive_score = 0 # set when the recursive score function is called

def __init__(self, board, turn_color):
self.board = copy.deepcopy(board)
self.turn_color = turn_color
for x in range (0,7):
for y in range (0,7):
self.board_score = self.board_score + self.board[x][y]

def add_child(self, child):
self.children.append(child)
self.numChildren = self.numChildren + 1

def recursive_score_calc(self):
current_score = self.board # if no valid moves, we are the board. no move will make our score worse
for c in self.children:
child_score = c.recursive_score_calc()
if(turn_color == 1):
if(child_score > current_score):
current_score = child_score
else:
if(child_score < current_score):
current_score = child_score
self.recursive_score = current_score
return current_score

与之交互的功能(请注意,这接近于适合在这里发布的内容的边缘,我将在接受答案后删除这部分):[结果不是无论如何都是关键部分]

最佳答案

这段代码:

class TreeNode:
children = []

意味着该类的每个 实例共享相同的children 列表。所以,在这一点上:

def add_child(self, child):
self.children.append(child)

您正在附加到“class-global”列表。因此,当然,每个节点都是其他每个节点的子节点,灾难就在所难免。

修复:将您的类(class)更改为

class TreeNode(object):
numChildren = 0
board = zeros([8,8], Int)
turn_color = 0 # signifies NEXT to act
board_score = 0 # tally together board items
recursive_score = 0 # set when the recursive score function is called

def __init__(self, board, turn_color):
self.children = []
self.board = copy.deepcopy(board)
self.turn_color = turn_color
... etc, etc ...

其余的不需要更改来修复这个bug(虽然可能有机会改进它或修复其他bug,但我没有深入检查它),但未能分配self.children __init__ 中的 > 导致您当前的错误,并且无法从 object 继承(除非您使用的是 Python 3,但我希望您能提及 如果是的话,这个小细节;-) 只是一个等待发生的错误。

关于python - Python 中的无限递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2286019/

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