Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 函数式编程中的编程棋_Performance_Functional Programming - Fatal编程技术网

Performance 函数式编程中的编程棋

Performance 函数式编程中的编程棋,performance,functional-programming,Performance,Functional Programming,一年前,我使用Alphabeta修剪算法编程了一个国际象棋AI。这在C++中是相对简单的。在这样做时,我考虑的主要问题之一是提高代码的效率。我通过使用一个我称之为游戏的数据类型来实现这一点,我通过算法生成的搜索树传递了这个数据类型。为了提高效率,我没有复制游戏数据类型,而是对其进行了变异,同时保留了将其返回到以前状态所需的必要信息 最近我一直在阅读有关函数编程的书籍,纯粹使用不会改变传递参数状态的函数的概念吸引着我。我想知道我将如何使用函数式编程的范例,同时仍然考虑到程序的效率 在面向对象编程中

一年前,我使用Alphabeta修剪算法编程了一个国际象棋AI。这在C++中是相对简单的。在这样做时,我考虑的主要问题之一是提高代码的效率。我通过使用一个我称之为游戏的数据类型来实现这一点,我通过算法生成的搜索树传递了这个数据类型。为了提高效率,我没有复制游戏数据类型,而是对其进行了变异,同时保留了将其返回到以前状态所需的必要信息

最近我一直在阅读有关函数编程的书籍,纯粹使用不会改变传递参数状态的函数的概念吸引着我。我想知道我将如何使用函数式编程的范例,同时仍然考虑到程序的效率


在面向对象编程中,解决方案似乎非常简单,这是我实现的,而在函数式编程中,复制数据类型似乎是不必要的,这会降低效率。是否可以使用函数式编程而不损失效率?

在函数式编程中,数据结构并不总是完全复制的。在许多情况下,只需要复制更改的零件,而旧零件可以引用,因为不允许变异,这是安全的


关于的文章对此进行了更详细的描述。

Jephron的回答指出了一个重要的事实,即只有持久数据结构的一小部分需要更新,因此较大的部分在旧状态和新状态之间共享

老实说,在大多数情况下,这仍然比突变慢

但不变的持久数据结构还有其他优势。假设您已经完成了播放引擎。现在,您想要实现一个历史记录,例如,允许玩家撤销先前的移动。这非常简单:只需记住列表中的所有状态。你会发现你只需要点击几个函数就可以得到一个状态列表,而不仅仅是最后一个状态,你就完成了。你不必担心会影响你的游戏引擎,因为没有全局变量或者你可以破坏的东西

另一件事是通过使用并行性来利用您可能拥有的许多CPU核心。不用说,您不能让许多任务、线程、光纤或任何东西在单个可变数据结构上运行。这将成为一场同步噩梦,您的代码可能会变得更慢。但是,不可变数据上根本没有同步问题,因为它们对所有线程都是只读的。 这可以很好地加速代码,使它与C++解决方案相形见绌,即使在函数数据结构上的移动比可变数据慢得多。 下面是一个将棋盘游戏TTT从单线程更改为并行的示例: