我在Dr.Retet中使用Simply Scheme。在計劃中跨樹節點應用函數
問題是編寫樹圖,類似於深度圖,但對於樹,使用數據和子選擇器。這是深圖:
(define (deep-map f structure)
(cond ((word? structure) (f structure))
((null? structure) '())
(else (cons (deep–map f (car structure))
(deep–map f (cdr structure))))))
這是我在樹的地圖嘗試至今:
(define (tree-map f structure)
(cond ((leaf? structure)
(f (datum structure)))
(else
(cons (tree-map f (car (children structure)))
(tree-map f (cdr (children structure)))))))
這些是樹的構造函數和選擇:
(define (make-node datum children)
(cons datum children))
(define (datum node)
(car node))
(define (children node)
(cdr node))
(define (leaf datum)
(make-node datum '()))
(define (leaf? node)
(null? (children node)))
對於我測試用例我正在使用此功能的數字樹,例如square:
(define number-tree
(make-node
'56
(list (make-node
'2
(children '(34 25 7 89)))
(make-node
'32
(list (make-node
'27
(children '(13 55 80)))
(make-node
'1098
(children '(45 785 98)))
(make-node '123 (children '(9046)))))
(make-node '23 (children '(1 9)))
(make-node '867
(children '(1 3 5 78)))
(make-node
'0
(list
(make-node '78 (children '(984)))
(make-node '45
(children '(23 46 78467)))
(make-node '3 (children '(2))))))))
我收到的錯誤消息是'cdr,違反合同,期望的對'。到目前爲止,我還沒有太多處理Scheme中的列表的問題 - 我似乎得到了它們。但是,轉化爲樹會導致我遇到問題 - 原則上我得不到這些東西,這意味着我不斷收到有關樹問題的與這些列表相關的錯誤消息。我試圖繼續使用抽象類型(樹和節點)而不考慮列表。 我正在以正確的方式解決這個問題嗎?任何幫助理解我錯過了與樹木一起工作很好,非常感謝。
謝謝你的幫助。樹圖確實奏效。理解我用數字樹所犯的錯誤是很好的。 – Nufdriew