2011-01-07 6 views
2

私はバイナリ検索ツリーに要素を挿入するための簡単な手順をLispで書こうとしています。Lispでのリストの問題

Iをリストとしてツリー表される:

  • をツリー内の最初の要素はルート
  • 第二要素は第三の要素は右サブ左サブツリー
  • ありますツリー

これは私のコードです:

(define Insert 
    (lambda (x T) 
    (if (null? T) 
     (list x '() '()) 
     (if (> x (car T)) 
      (list (car T) 
        (cadr T) 
        (Insert x (list (caddr T)))) 
      (list (car T) 
        (Insert x (cadr T)) 
        (list (caddr T))))))) 

(Insert 2 '(4 '(2 '() '()) '()))のようなプロシージャを呼び出すと、2番目の引数が実数ではないため ">"に問題が発生しますが、理由はわかりません。

例外:しかし

>: expects type <real number> as 2nd argument, given: quote; other arguments were: 2 

、私はこのようなプロシージャを呼び出す:それが正常に動作します 、​​。

なぜですか?

私は'(1 '() '())(list 1 '() '())が等しいことを知っていますか?

答えて

1

'(1 '())は、(list 1 (list 'quote nil))に相当します。私はあなたが "内部"引用符文字をドロップすると、あなたは大丈夫だろうと思う。

したがって、(list 1 '() '())に等しい式を生成する引用符付き式は'(1()())です。

+0

ありがとう、私は内部引用符をドロップすると動作します:) –

+0

また、Lispの 'nil'はSchemeの' '()です。 – erjiang

+0

@erijang:ああ、私はnilと()は同じだと思ったが、nilと#fは違っていた。 – Vatine

2

いいえ、quotelistは全く同じではありません。 'fooの意味は(quote foo)です。

'(a b c)リストリテラルquoteオペレータが評価されるのリストを防止する)、つまり、正確(quote (a b c))あります。これは"a b c"に匹敵し、文字列リテラルまたは5です。リテラルです。リテラルを変更する操作には、定義されていない影響があります。(setf 3 4)のようなナンセンスが発生したときにすぐに認識することができます。一方、a,b、およびcの値から新しいリストを作成( "conses")します。

私は、quotelistについての混乱を解消すれば、コードを修正できることを確信しています。

+0

+1私はyaに同意します。 –