如何防止 RangeError:在有限递归函数中超出最大调用堆栈大小? | JavaScript

问题描述

我正在尝试制作一个 Connect 4 Bot,它使用 minimax 算法 来运行。 显然,遍历所有可能的游戏状态对我的程序来说太多了,所以我需要一种方法来防止错误发生。

我看到您可以使用 setTimeout() 使大型递归函数可在 JavaScript 中运行,但我并没有真正找到理解它的方法

所以我想问一下是否有人可以举一个例子来说明如何将 setTimeout() 实现到一个递归函数中以使其可运行。

(抱歉可能有英文错误。)

解决方法

我想说更好的方法是使用所谓的迭代深化。我根本不懂 Javascript,所以请原谅我用伪代码/Python 发帖。

start_time = current_time
for depth in range(1,inf):
    score = minimax(depth,......)

    if current_time - start_time >= max_allowed_time:
        break

所以当你开始循环时你就会得到时间。然后你会越来越深(从深度 1 开始),直到当前时间减去你开始循环的时间超过你指定的最大时间值。现在它将在给定的时间限制内尽可能深入地搜索。

乍一看,这似乎比仅搜索给定深度要慢。但如果您稍后实现例如移动排序和换位表,它实际上会加速您的代码。而且由于每个深度的时间呈指数增长,因此搜索第一个深度 1、然后 2、然后 3 所花费的时间比立即搜索深度 3 所花费的时间大可以忽略不计。

希望我说清楚,英语也不是我的母语:)