2017-10-31 6 views
0
(define (min list) 
(cond ((empty? (car list) '"It is empty")) <- Problem is here. Code work without this line. 
     ((empty? (cdr list)) (car list))   ;to check list is empty 
     ((< (car list) (min (cdr list))) (cdr list)) 
     (else (min (cdr list))))) 

私はスキームプログラミング言語には非常に新しいです。私はリストから最小値を取得しようとしています。私が()を入れると、プログラムは私にエラーを出します:cdr:契約違反が予想されます:ペア?与えられた: '()。私がここでやろうとしていることは、印刷したいということです。ユーザータイプ()が空のときは空です。それはSchemeプログラミングのように可能ですか?ユーザーがリストに何も入れていないかどうかを確認する方法は?スキームプログラミング

+0

リストの最初の要素( 'car')が空であるかどうかチェックしますか?または、リストが空であるかどうかチェックしたいですか?リストが空の場合、最初の要素をリストから取り出すことはできません。まず、リストが空であるかどうかをチェックする必要があります。それが空でなければ、最初の要素を取ることができます。例: '(if(pair?some-list)(car some-list))'。何かがペアであれば、最初の要素を取ることができます。そうでなければ。 – ceving

答えて

0

この質問に対する回答は、ラケット言語の開発者が書いたHow To Design Programs, 2eのテキストにあります。

この場合、リストの関数にテンプレートを使用したいとします。これはセクションII、より詳細にはセクション9.1でカバーされています。

0

Schemeと他のLisp言語のリストの構造は、コンスセルに基づいています。

  +-+-+     
     |1|----+    
     +-+-+ |    
       +-+-+   
       |2|---+   
       +-+-+ |   
         +-+-+  
         |3| |  
         +-+-+ 

最終短所セル、各短所セル値(car)とリストに、このような次のコンス・セル(cdr、顕著参照-DAR)へのポインタを含みますリストの終わりは、ゼロを含んでいます。 Schemeの表記では、短所-セルは次のようになります。

(1 . 2) 

だからリストは、任意のシンタックスシュガーせずに、次のようになります。

(1 . (2 . (3 . (4 . nil)))) 

空のリスト、コンス・セルで構成されています

(nil) 

空リストにはcarがありません。空リストはnilのように扱われますので、これは次のようになります。

(1 . (2 . (3 . (4 .())))) 

前のように動作します。あなたは糖衣構文を使用する場合

は今、リストは次のようになります。

(1 2 3 4) 

しかし、根本的な構造は同じです。したがって、空リストがあるかどうかを調べるには、それがnilかどうかをテストします(どのSchemeがempty?関数で実行するか)。そのため、リストの車のempty?を呼び出す代わりに、間違った考え方とエラーがある場合は、リストで呼び出してください。だからあなたの関数は次のようになります。リストには、一つだけ、あるいは全くの要素を持っている場合、それはチェック:第二のアームは、あなたのコメントが言うように、リストは、空であることをないチェックを行うこと

(define (min list) 
(cond ((empty? list "It is empty")) 
     ((empty? (cdr list)) (car list)) 
     ((< (car list) (min (cdr list))) (cdr list)) 
     (else (min (cdr list))))) 

は注意してください。あなたのcdrが空で、車がない場合(2番目の腕が許す)、1つの要素リストがあります:

(foo .()) 

これは役に立ちます。

特定の機能を向上させる方法の詳細については、Oscar Lopez's answer to this questionを参照してください。

0

空リストを印刷するか、最小値を取得したいと思いますか?

(define (min list) 
     (if (null? list) 
      "It's empty." 
      (let loop ([loop_list list] 
        [min_value (car list)]) 
      (if (null? loop_list) 
       min_value 
       (loop 
       (cdr loop_list) 
       (if (< min_value (car loop_list)) min_value (car loop_list))))))) 
関連する問題