我想在方案中定义一个函数,该函数将接受一个数字/字母,例如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)