Algorithm 如何用函数式语言编写简单的树算法?

Algorithm 如何用函数式语言编写简单的树算法?,algorithm,functional-programming,Algorithm,Functional Programming,假设我想实现一个相当有效的“关键字识别算法”,即首先给出一个关键字列表,然后必须回答列表中是否有另一个给定的单词 在命令式语言中,我将关键字存储在树中(每个字符一个节点)。然后,当收到一个要测试的单词时,我会扫描我的树来测试这个单词是否是关键字 我想了解这样一个算法是如何用函数式语言编码的。如何在保持“命令式”算法效率的同时获得“无状态”编程的好处。如果不想每次都重建树,是否需要在查找之间的某个位置存储树 我想你会想要一个像树一样的东西,上面有一列子元素。我想你的意思是每个节点有一个字符。。。有

假设我想实现一个相当有效的“关键字识别算法”,即首先给出一个关键字列表,然后必须回答列表中是否有另一个给定的单词

在命令式语言中,我将关键字存储在树中(每个字符一个节点)。然后,当收到一个要测试的单词时,我会扫描我的树来测试这个单词是否是关键字


我想了解这样一个算法是如何用函数式语言编码的。如何在保持“命令式”算法效率的同时获得“无状态”编程的好处。如果不想每次都重建树,是否需要在查找之间的某个位置存储树

我想你会想要一个像树一样的东西,上面有一列子元素。

我想你的意思是每个节点有一个字符。。。有点像用于关键字查找的简单哈希树方案。假设这棵树或是另一棵树。。。想象一下这样做(在伪LISP中):

如果这就是你的意思,这是相当直接的函数式编程。 它真的是无国籍的吗?这是一个有争议的问题。有些人会说 函数式编程的形式将我们通常称之为“状态”的东西存储在堆栈上。 此外,即使是从斯蒂尔的书的第一版开始,CommonLisp就已经有了迭代 构造,LISP拥有setq已经很长很长时间了

但是在编程语言理论中,我们所说的“无状态”对这里所示的思想非常满意

我认为上面的安排与你的意思类似

(defun buildtree (wordlist) ...code to build tree recursively returns the tree...)
(define lookup (tree word) ...code to look up word using tree, returns t or nil...)

(defun lookupmany (tree querylist)
   (if (eq querylist nil)
       nil
       (cons (lookup tree (car querylist)) (lookupmany tree (cdr querylist))
   )
)

(defun main (wordlist querylist) ; the main entry point
   (lookupmany (buildtree wordlist) querylist)
)