【问题标题】:How can a simple tree algorithm be coded in a functional language?如何用函数式语言编写简单的树算法?
【发布时间】:2010-09-07 23:55:20
【问题描述】:

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

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

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

【问题讨论】:

    标签: algorithm functional-programming


    【解决方案1】:

    我认为您的意思是每个节点一个字符...有点像用于关键字查找的简单哈希树方案。假设这种树甚至另一种树......想象一下做这样的事情(在伪 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 很长时间了。

    但是在编程语言的理论中,我们所说的“无状态”的含义已经很满足这里展示的想法了。

    我认为上面的安排有点像你的意思。

    【讨论】:

      【解决方案2】:

      我想你会想要像 here 所述的带有子列表的树。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-28
        • 2020-03-26
        • 2017-02-21
        相关资源
        最近更新 更多