从列表末尾开始在另一个单词旁边插入单词

时间:2018-06-13 16:56:44

标签: scheme racket

我的代码是在选择的单词

的右侧插入新单词
(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)))))))))

我需要让它在从列表末尾开始的单词首次出现旁边插入该单词。试图使用反向工作但无法使其工作。

1 个答案:

答案 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)))))))