【发布时间】:2017-12-27 01:28:42
【问题描述】:
我在 Scheme 中做一个问题,即创建一个函数,该函数接受一个对象和一个表达式,例如 (foo 'x '(x 10 x x 4)) 并且必须返回给定对象后面的所有对象,所以上面的函数调用将返回 @ 987654322@。但是,表达式也可以包含列表,例如 (foo 'y '(y (3 y 5 y y 8 9) (10 y 12 13 y 15 y) 17)) 应该返回 ((3 y 5 y y 8 9) 5 y 8 12 15)。当它们包含列表时我遇到了麻烦。到目前为止,这是我的代码。
(define (foo target expression)
(cond [(null? expression)]
[(list? (first expression)) (foo target (first expression))]
[(eqv? (first expression) target) (cons (first (rest expression)) (foo target (rest expression)))]
[(not (eqv? (first expression) target)) (foo target (rest expression))]))
所以当表达式包含一个列表时,我试图递归调用该列表上的函数,但是,我不知道如何返回原始表达式以继续搜索。
所以当我调用(foo 'y '(y (3 y 5 y y 8 9) (10 y 12 13 y 15 y) 17)) 时,我得到了((3 y 5 y y 8 9) 5 y 8 . #t),所以它成功循环通过第一个列表,但之后它停止并且没有到达表达式中的第二个列表
另外,我遇到的另一个问题是结果末尾的布尔值,我知道这是因为 cond [(null? expression)] 行,我添加了这个是因为当它到达末尾时出现错误表达式,我该如何解决这个问题?
【问题讨论】:
标签: scheme