假設我想實現一個合理有效的「關鍵字識別算法」,它首先給出關鍵字列表,然後必須回答列表中是否有其他給定單詞。簡單樹算法如何用功能語言編碼?
在命令式語言中,我會將關鍵字存儲在樹中(每個字符一個節點)。然後,當收到要測試的單詞時,我會掃描我的樹來測試單詞是否爲關鍵字。
我想了解如何將這種算法編碼爲功能語言。如何在保持'命令式'算法效率的同時獲得'無狀態'編程的好處。如果你不想每次都重建它,那麼是否有必要將樹存儲在查找之間的某處?
假設我想實現一個合理有效的「關鍵字識別算法」,它首先給出關鍵字列表,然後必須回答列表中是否有其他給定單詞。簡單樹算法如何用功能語言編碼?
在命令式語言中,我會將關鍵字存儲在樹中(每個字符一個節點)。然後,當收到要測試的單詞時,我會掃描我的樹來測試單詞是否爲關鍵字。
我想了解如何將這種算法編碼爲功能語言。如何在保持'命令式'算法效率的同時獲得'無狀態'編程的好處。如果你不想每次都重建它,那麼是否有必要將樹存儲在查找之間的某處?
我想你的意思是每個節點上的字符......有點像關鍵字查找的簡單哈希樹方案。假設這甚至是另一種樹......想象做這樣的事情(在僞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。
但是在編程語言理論中,我們所說的「無狀態」的意思是非常滿意的。
我認爲上面的東西就像你的意思。
我想你會想要像樹一樣的兒童列表,如here所述。