我的代码是在选择的单词
的右侧插入新单词(define insertR
(lambda (new old lst)
(cond
((null? lst) (lst))
(else (cond
((eq? (car lst) old)
(cons old
(cons new (cdr lst))))
(else (cons (car lst)
(insertR new old
(cdr lst)))))))))
我需要让它在从列表末尾开始的单词首次出现旁边插入该单词。试图使用反向工作但无法使其工作。
答案 0 :(得分:0)
以类似的方式写insertL
并将其应用于反向列表。
并扭转结果。然后,您将在从列表末尾开始的单词首次出现旁边插入
(define insertL
(lambda (new old lst)
(cond ((null? lst) '())
((eq? (car lst) old) (cons new lst))
(else (cons (car lst) (insertL new old (cdr lst)))))))
(define last-insertR
(lambda (new old lst)
(let* ((rlst (reverse lst))
(result (insertL new old rlst)))
(reverse result))))
试验:
(last-insertR 'aa 'a '(b c d a h i a g))
;; '(b c d a h i a aa g)
顺便说一下,cond
的美妙之处在于你可以将条件始终放在开头 - 列出一个在另一个之下。
因此,可以将您的insertR
更好地写为:
(define insertR
(lambda (new old lst)
(cond ((null? lst) '())
((eq? (car lst) old) (cons old (cons new (cdr lst))))
(else (cons (car lst) (insertR new old (cdr lst)))))))