如果没有其他的方案和表达



我想在方案中定义一个函数,该函数将接受一个数字/字母,例如x和一个列表(也可以包含列表(,并返回紧跟在x之后的数字/字母。 例如 (foo 'x '(x (3 x 5 x x 8 9( (10 x 12 13 x 15 yx 17((=> ((3 x 5 x 8 9( 5 x 8 12 15(。 我以为我有代码工作,但后来发现如果列表的最后一个元素是列表,它将不起作用。 我想更改行((空?(CDR LS(('((( 类似于 ((和((不是 (列表?(ls(((((空?(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

测试'(null? (cdr ls) '())的顺序是问题的原因。即。当(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)

相关内容

最新更新