有沒有在Scheme中執行二叉樹的標準方法,因此程序(如left
和right
,leaf?
和node?
)對建模數據的不同方式具有不同的實現。例如。下面是一個使用矢量:
(define TYPE-TREE (vector 'TREE)) ; private
(define (make-tree value left right)
(vector TYPE-TREE value left right))
(define (tree? tree)
(and (vector? tree)
(eq? (vector-ref tree 0) TYPE-TREE)))
(define (tree-value tree)
(vector-ref tree 1))
(define (tree-left tree)
(vector-ref tree 2))
(define (tree-right tree)
(vector-ref tree 3))
(define (tree-node-count tree)
(let aux ((tree tree) (count 0))
(if (not (tree? tree))
count
(aux (tree-right tree)
(aux (tree-left tree) (+ 1 count))))))
(define test (make-tree 5 (make-tree 2 '() '()) (make-tree 10 '() '())))
(tree-node-count test) ; ==> 3
當然,你會在一個庫中把這個包,並保持TYPE-TREE隱藏。要回答您的問題,您需要將其過程替換爲其實施。在上述模型中的情況下tree-node-count
是這樣的:
(define (tree-node-count tree)
(let aux ((tree tree) (count 0))
(if (not (and (vector? tree)
(eq? (vector-ref tree 0) TYPE-TREE)))
count
(aux (vector-ref tree 3)
(aux (vector-ref tree 2) (+ 1 count))))))
正如你可以看到它的原程序的身體的一個簡單的替換。我當然會反對,因爲這隻會讓代碼和程序員的意圖不太清楚。刪除抽象並不會贏得你的觀點。
R5RS方案中沒有'node?'或'leaf?'*過程*。就像'value'和'left'一樣,它們需要根據您對節點的建模方式來創建。 – Sylwester
我問的問題是如何在沒有它們的情況下創建這個功能?我不太清楚如何定義它們。我最好的嘗試是(定義(leaf?n) (和(equal?left'())(equal?right'()))),當我給它一個葉子時返回#f。 – TPerson