(方案)检查一般程序是否属实?

时间:2013-03-30 20:24:55

标签: list scheme

我创建了一个程序,该程序应该将谓词中的所有元素都放在列表中。它确实有用,但不适用于>,<等等。它只适用于零等事情吗?否定?我怎样才能使它适用于<,>等?

(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...

2 个答案:

答案 0 :(得分:0)

在你的函数中,谓词只有一个参数。这使得它适用于zero?之类的谓词,但不适用于带有两个参数的谓词,例如<>

一个可能的变化,它比较列表中的连续对,然后返回满足谓词的元素是这样的:

(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))))))

答案 1 :(得分:0)

您正在描述filter程序(或divide1,正如您所说的那样):

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

该过程接收单参数谓词函数和列表作为参数。这就是为什么它适用于zero?negative?(两者都接收一个参数)的原因,但它会因<而失败,因为它需要两个参数 - 换句话说,您必须指定 小于的内容。例如,使用<测试小于零的项目:

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

总之:要使其适用于<>等,您必须传递lambda,其中一个参数是固定值({{1在上面的例子中),另一个是列表中的当前元素(前一个例子中的0。)