1

二分木をたどる関数の作成に問題があります。この関数は search_term とリストを受け取り、true または false を返します。これが私が持っているもので、Schemeでバイナリ検索を実装する方法をグーグルで見つけたのと本質的に同じです。

(define (tree-lookup val tree)
  (if (empty-tree? tree) 
      #f
  (let ((curr-val (node-value tree))
    (left (node-left tree))
    (right (node-right tree)))
    (cond ((equal? val curr-val) #t)
      ((< val curr-val))
       (tree-lookup val left)
      (else
       (tree-lookup val right))))))

(define tree-test '(((1 2) 3)(4 (5 6)) 7 (8 9 10)))  ; Test tree

問題は、「val」変数をノードと比較しようとしたときに発生します。これは、(< 2 '((1 2) 3)) のように、実数をリストと比較していることを意味します。アトム値のみをテストしようとしましたが、葉に到達したときにツリーを元に戻す方法に行き詰まっています。

エラーメッセージは次のとおりです。

  <: contract violation
  expected: real?
  given: '{{1 2} 3}
  argument position: 2nd
  other arguments...:
  8 
4

1 に答える 1

2

一見、手順は問題ないように見えます。問題は、node-value手順、またはツリーの構築方法にあるnode-leftnode-right思われます。まず、質問で提供されているサンプルツリーは私には正しくないようです。

考えてみてください。エラーメッセージは、<演算子がリストに適用されたことを示します。'{{1 2} 3}つまりcurr-val、リストですが、値である必要があります。

于 2012-08-23T01:13:55.503 に答える