如果没有别的方案和表达

时间:2018-01-12 15:48:00

标签: scheme

我想在方案中定义一个函数,该函数将采用数字/字母,例如x和一个列表(也可以包含列表)并返回紧跟在x之后的数字/字母。例如(foo' x'(x(3 x 5 x x 8 9)(10 x 12 13 x 15 yx 17)) => ((3 x 5 x x 8 9)5 x 8 12 15)。我以为我有代码工作但后来发现如果列表的最后一个元素是列表它将无法工作。我想将行((null?(cdr ls))'())更改为((和((not(list?(ls))))(null?(cdr ls))) '()) - 即。如果最后一个元素不是列表返回'()但这似乎不是有效代码。有没有办法,我可以有这样的东西或没有其他的if语句?

(define foo
(λ (x ls)
      (cond ((null? ls) ‘())
            ((not (list? ls)) '())
            ((null? (cdr ls)) '())
            ((equal? x (car ls))
               (cons (car(cdr ls))(foo x(cdr ls))))
            ((list? (car ls))
               (append (foo x(car ls))
                       (foo x(cdr ls))))
            (else (foo x (c

1 个答案:

答案 0 :(得分:0)

测试'(null? (cdr ls) '())的顺序是导致问题的原因。 IE浏览器。当(car ls)是一个列表本身时,该函数仍返回'(),因为'(null? (cdr ls) '())在案例之前被评估

((list? (car ls))
 (append (foo x (car ls))
         (foo x (cdr ls))))

考虑以下对cond测试用例的重新排序:

(define (foo x ls)
  (cond
    ((null? ls) '())
    ((not (pair? ls)) '())
    ((pair? (car ls))
     (append (foo x (car ls))
             (foo x (cdr ls))))
    ((null? (cdr ls)) '())
    ((equal? x (car ls))
     (cons (cadr ls) (foo x (cdr ls))))
    (else
     (foo x (cdr ls)))))

然后你会:

(foo 'x '())
=> '()
(foo 'x '(x))
=> '()
(foo 'x '(x (3 x 5 x x 8 9) (10 x 12 13 x 15 yx 17)))
=> '((3 x 5 x x 8 9) 5 x 8 12 15)