0

ツリー マップ関数の 90% をスキームで記述しましたが、大きな問題が発生して困っています。コードをバイナリ ツリーでテストすると、最初のノード以外はすべて適切にマップされます。最初のノードが脱落し、これを回避する方法が思いつかないようです。ここでアドバイスをいただければ幸いです。

(define (value tree)
 (car tree))

(define (left tree) 
  (car (cdr tree)))

(define (right tree)
 (car (cdr (cdr tree))))

(define (tree-map f T)
 (cond ((null? T) '())
     ((and (null? (right T))(null? (left T))) '())                                                              
     ((and (null? (right T))(not (null? (left T))))
                    (make-tree (f (value(left T)))
                               (tree-map f (left T))
                               (right T)))
     ((and (null? (left T))(not (null? (right T))))
                    (make-tree (f (value(right T)))
                               (left T)
                               (tree-map f (right T))
                               ))))
4

2 に答える 2

3

このコードは本当に複雑です。最初に、else ステートメントが表示されず、かなり大きなケース ドロップ (両方のブランチがヌル トレスでない場合) が表示されません。次に、null ツリーのケースが既にあるのに、左または右が null であると心配するのはなぜですか?

(define (tree-map f T)
 (cond ((null? T) '())
       (else (make-tree (f (value T))
                        (tree-map f (left T))
                        (tree-map f (right T))))))

人間のコンパイラであることは楽しいことではありません。葉、空の左、および空の右のケースで行ったのは、同じコードを書き直すことだけですが、関数に頼ってそれを行うのではなく、適切な場所に手動で '() をドロップします。

于 2013-10-17T17:57:42.917 に答える