2016-12-04 6 views
1

に番号を挿入する私はこのコードを持っている:スキーム - リスト

(define (Insert value list) 
    (if (null? list) (list value)) 
    (if (< value (car list)) (list (Insert (value list)))) 
    (Insert (cdr list) list)) 

を、私は、このコードは(それが整数の昇順に、低中だと仮定した場合)のリストを取り、正しい場所に番号を挿入したいです。このコードは動作しませんが、私は理由を知りません。誰でも知っていますか?

+0

ここでは、出力リストを作成する際の基本的なエラーがあります。 'cons'を使ってください。あなたのテキストブックを参照してください。 –

答えて

2

あなたにはいくつかのエラーがあります。のは、あなたのコードで何が悪かったのか見てみましょう、今

(define (insert value lst) 
    (cond ((null? lst)   ; if the list is empty 
     (list value))  ; then return a single-element list 
     ((<= value (car lst)) ; if current element >= value 
     (cons value lst)) ; insert value in current position 
     (else     ; otherwise keep building the list 
     (cons (car lst)  ; by adding current element 
       (insert value (cdr lst)))))) ; and advancing recursion 

:まず、あなたはあなたの実装を修正する方法を見てみましょう、

  • あなたはパラメータlistに名前を付けてはならないこととの衝突ビルトイン同じ名前のプロシージャー - 実際に使用しているプロシージャーそれらが競合することは明らかです。
  • 複数の条件がある場合、条件式は正しく構成されていません。cond式を使用します。最初の2つの値がネストされていないので、ifの値は破棄されます(プロシージャ内では、の値が最後にという式が返されます)。一部のSchemeインタプリタは、対応するelseの部分なしでifを書き込むとエラーを発生させます。
  • 2番目の条件では、リストの残りの部分とvalueで再帰を停止する必要があります。それは> =値要素が、場合に最後の条件で繰り返し要素
  • がある場合は、できるだけ早く停止すると良いでしょう、あなたは間違った順序でパラメータを渡している、ともvalue
  • 忘れてしまいました最後の条件は、忘れたcons現在の要素
+0

condとその他を使用していますか? –

+0

@A.Lいいえ、代わりに 'if'sをネストできます。それは醜いですが、動作します。あなたが保証するものは、条件が相互に排他的であることです。 –

+0

コンサルトの使用はどうですか?私は追加だけを使った経験があります。この場合、仕事を追加するだろうか?または、必要があります –

1

あなたのコードにいくつかの誤りがあります。まず、Schemeでは、ifにelse節を含めるのが自然です。また、最後のifが間違っていました。

(define (Insert value lst) 
    (if (null? lst) (list value) 
     (if (< value (car lst)) 
      (cons value lst) 
      (cons (car lst) (Insert value (cdr lst)))))) 

(注)値はリストの先頭に満たないときのためのアクションを提供する必要があり、それはない、としたときに返すを構築する必要があります。ここでは軽微な変更を使用してコードのバージョンがあります値はconsです。

+0

入力していただきありがとうございます –