2017-12-19 35 views
1

私はスキームを学習しています。たとえば、負の数のリストを削除する方法を知りたいので、ポジティブを扱うことができます。これまではネガを削除する代わりに#がありました。ここで が私のコードです:schemeのリストで特定の範囲の数値を扱うにはどうすればいいですか?

(define test 
    (lambda (list) 
     (map (lambda (x) (if (> x 0) x))list))) 
+1

[フィルタ](https://docs.racket-lang.org/reference/pairs.html?q=filter#%28def._%28%28lib._racket%2Fprivate%2Flist..rkt%)を使用できます。 29._フィルター%29%29)。 – Renzo

+0

@Renzo私の大学は適応しないので、私は知っていますが、私は以前のバージョンを使用しています。だから私はこのようにしています。 –

+0

私はスキームのバージョン372を使用しています。 –

答えて

1

私は0に、リストのネガを回したので、それは私が何をするかには影響しません。

は、ここでのコードです:

(define test 
    (lambda(list) 
     (map (lambda (x)(if (> x 0) x 
        0))list) )) 
+0

あなたが最大のものを探しているなら、良いアイデア。最小限で、あまり良くない。 :) :)しかし、あなたはこれをさらに少し進めることができます:それぞれの正の 'x'を'(リストx) 'に変え、それぞれの負の' x'は '(リスト)'( 'x'なし、すなわち空リスト)。次に、リストの結果のリスト(一部はシングルトンリストで、その他は空です)に '(append ...)を適用します。結果はどうなりますか? (例えば、append(list '(1)'() '(3))) ')を試してみてください。 –

1

あなたがdisectと要素によって、リストの要素を再構築する必要があります。これはSchemeの非常に一般的な再帰的パターンであり、コースの教材で深くカバーされるべきです。あなたが入力リストの正の値のみを含む新しいリストを構築することができ、それに

(define (filter pred? xs) 
    (let loop ((xs xs) (ys '())) 
    (cond ((null? xs) (reverse ys)) 
      ((pred? (car xs)) 
      (loop (cdr xs) (cons (car xs) ys))) 
      (else (loop (cdr xs) ys))))) 

:ここ

(define (filter list pred) 
    (cond ((null? list) 
      '()) 
     ((pred (car list)) 
      (filter (cdr list) pred)) 
     (else 
      (cons (car list) (filter (cdr list) pred))))) 
+0

述語の値が真である(逆ではなく)すべての要素をconsingすることで、組み込みの 'filter'に沿ったバージョンを作ることができます。 – assefamaru

+0

コードはすてきできれいですが、 - listは[schemeキーワード](http://community.schemewiki.org/?scheme-keywords)です - 引数の名前として使用するべきではありません – ghosh

2

filterの標準バージョンである

> (filter positive? '(3 9 -2 4 0 -1 7)) 
(3 9 4 7) 

あなたは可能性がありますmy blogをお楽しみください。これは、学習するための多くのスキームコードを提供しています。

関連する問題