1

述語に真であるすべての要素をリストに入れることになっているプログラムを作成しました。それは機能しますが、>、< などには機能しません。ゼロのようなものにのみ機能しますか? そしてネガティブ?<、>などで機能するようにするにはどうすればよいですか?

(define (divide1 pred? ls)
 (if (null? ls) '()
    (if (pred? (car ls))
        (cons (car ls) (divide1 pred? (cdr ls)))
        (divide1 pred? (cdr ls)))))

~(divide1 zero? '(0 0 4 5))
(0 0)
~(divide1 < '(0 -5 8 5))
(-5 5) <- I think...
4

2 に答える 2

0

filter手順を説明しています(またはdivide1、あなたが呼んだように):

(filter zero? '(0 0 4 5))
=> '(0 0)

このプロシージャは、1 パラメータの述語関数とリストを引数として受け取ります。これがzero?and (両方とも 1 つのパラメーターを受け取る) で機能する理由ですが、 ではnegative?失敗します。これは、 2 つのパラメーターが必要なためです。つまり、 whatより小さいものを指定する必要があります。たとえば、 を使用してゼロ未満の項目をテストするには:<<

(filter (lambda (x) (< x 0)) '(0 -5 8 5))
=> '(5)

結論: 、 などで機能させるに<は、引数の 1 つが固定値 (上記の例) で、もう 1 つがリストの現在の要素 (前の例) で>ある を渡す必要があります。 )lambda0x

于 2013-03-30T22:27:08.497 に答える
0

関数では、述語に引数が 1 つだけ与えられます。これにより、 のような述語では機能しますが、とzero?のような 2 つの引数を取る述語では機能しません。<>

リスト内の連続するペアを比較し、述語を満たす要素を返すようにするための 1 つの可能な変更は次のとおりです。

(define (divide2 pred? ls)
 (cond ((or (null? ls) (null? (cdr ls))))
        '()
       ((pred? (car ls) (cadr ls))
        (cons (car ls) (divide2 pred? (cddr ls))))
       (else
        (cons (cadr ls) (divide2 pred? (cddr ls))))))
于 2013-03-30T21:36:04.297 に答える