4

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

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

我想了解如何用功能语言对这种算法进行编码。如何在保持“命令式”算法的效率的同时获得“无状态”编程的好处。如果您不想每次都重建它,是否有必要在查找之间的某处存储树?

4

2 回答 2

2

我认为您的意思是每个节点一个字符...有点像用于关键字查找的简单哈希树方案。假设这种树甚至另一种树......想象一下做这样的事情(在伪 LISP 中):

(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)
)

如果这就是你的意思,这是相当直接的函数式编程。真的是无国籍吗?这是一个有争议的问题。有人会说某些形式的函数式编程将我们通常所说的“状态”存储在堆栈上。此外,Common LISP 甚至从 Steele 书的第一版开始就具有迭代构造,而 LISP 拥有 setq 已经很长时间了。

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

我认为上面的内容类似于您的意思。

于 2008-09-05T22:26:38.613 回答
0

我想你会想要像一棵带有孩子列表的树,如此处所述

于 2008-09-05T21:37:58.403 回答