2008-09-05 64 views
4

假設我想實現一個合理有效的「關鍵字識別算法」,它首先給出關鍵字列表,然後必須回答列表中是否有其他給定單詞。簡單樹算法如何用功能語言編碼?

在命令式語言中,我會將關鍵字存儲在樹中(每個字符一個節點)。然後,當收到要測試的單詞時,我會掃描我的樹來測試單詞是否爲關鍵字。

我想了解如何將這種算法編碼爲功能語言。如何在保持'命令式'算法效率的同時獲得'無狀態'編程的好處。如果你不想每次都重建它,那麼是否有必要將樹存儲在查找之間的某處?

回答

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

,如果這是你的意思,這是相當直接的功能編程。 它真的是無狀態的嗎?這是一個有爭議的問題。有些人會說一些功能性編程的 形式存儲我們通常稱爲「狀態」的堆棧。此外,即使自第一版Steele書以來,Common LISP也有迭代式的 構造,並且LISP已經有了很長很長的setq。

但是在編程語言理論中,我們所說的「無狀態」的意思是非常滿意的。

我認爲上面的東西就像你的意思。

0

我想你會想要像樹一樣的兒童列表,如here所述。