Java - 之后会删除递归函数中对类变量的更改吗?

Posted

技术标签:

【中文标题】Java - 之后会删除递归函数中对类变量的更改吗?【英文标题】:Java - Will changes to class variables in recursive functions be deleted afterwards? 【发布时间】:2017-12-19 13:07:09 【问题描述】:

我正在尝试实现极小极大算法。

对于那些不熟悉的人:2 个对手的递归函数(每个对手都有自己的回合。例如国际象棋、围棋等),它计算出什么是最好的移动对于玩家的每一回合,通过递归计算玩家 A 所选移动的结果,反之亦然。

之所以称为 Minimax,是因为第一个玩家总是试图最大化他的结果,而第二个玩家总是试图最小化第一个的结果[这也意味着最大化他的])

调用该函数的玩家类有棋盘(这是另一个类)。 玩家通过在棋盘上放置一个棋子来进行游戏,还有另一个函数可以计算分数/启发式分数。

我的问题如下:在计算每个玩家的结果时,我需要将棋子实际放在棋盘上,然后进行所有计算。一旦我再次上递归树,我的更改会被删除吗?

我感觉不会,因为即使 Java 通过值传递,我仍然会更改 Player 的表。所以我想知道我是否应该每次都复制我当前的棋盘并虚拟玩/将棋盘作为参数传递/等等...

【问题讨论】:

原则上 - 不,他们不会。变化就是变化,Java 中没有“回滚”的概念,因为没有“先前”值的概念。但是,为了更清楚起见,请显示一些示例代码。 我没有故意放任何代码。你指出的很清楚。我试图了解如何解决我的问题。简单地说——当试图根据类属性和变量计算结果时,有没有一种通用的方法来创建这种“回滚”行为(而不是每次都创建一个新的“类”)? 您的意思必须是“新实例”,而不是“新类”。目前尚不清楚我们在这里谈论的变化是什么。在某些情况下,由于这是递归函数,所以回滚只是反向操作,不需要额外的对象,但需要额外的 CPU。否则,您确实需要某种操作日志,无论是专用对象堆栈,还是每次调用时操作类的新实例。 【参考方案1】:

我感觉不会,因为即使 Java 通过值传递,我仍然会更改 Player 的表。所以我想知道我是否应该每次都复制我当前的棋盘并虚拟玩/将棋盘作为参数传递/等等...

这是一种选择。另一种解决方案(通常在计算上更有效)是实现并使用一个 undo() 函数来反转棋盘上移动的效果。

【讨论】:

以上是关于Java - 之后会删除递归函数中对类变量的更改吗?的主要内容,如果未能解决你的问题,请参考以下文章

python中类的构造方法中需要定义和初始化变量吗?

java vm 之 虚拟机启动对类的操作

递归回溯算法期间变量未更改

Vue中对生命周期的理解

js中对类和对象的理解

Java 多线程 资源冲突