1

我需要用 Scheme 中的另一个元素替换列表中的一个元素,但问题是我需要替换的列表可以嵌套。

例如,如果我有列表'(1 (2 3 4 5) (6 7))并且需要将 5 替换为 9,那么我的输出应该是'(1 (2 3 4 9) (6 7)).

你能帮我解决这个问题吗?

4

2 回答 2

3

解决此类问题有一个基本策略:

  1. 首先,解决一个平面列表。即,编写函数以便在输入列表没有子列表的情况下工作。
  2. 然后,添加一个条件,以便如果您正在检查的元素是一个列表,则使用该列表递归到您的函数中。

这是一些骨架代码:

(define (replace lst from to)
  (cond ((null? lst) '())                ;; end of input
        ((list? (car lst)) <???>)        ;; encountered a sublist
        ((equal? (car lst) from) <???>)  ;; found the element we're replacing
        (else <???>)))                   ;; everything else

请注意,第二个cond子句 ,(list? (car lst))是支持子列表的版本中唯一的新内容。

于 2013-04-06T21:53:21.883 回答
2

这是一个功能:

(define (replace L new old)
   (cond ;;((null? L) L)
         ((list? L)
          (map
              (lambda (lst) (replace lst new old))
              L))
         (else
              (if (equal? L old)
                   new
                   L))))

使用示例:

> (replace '(1 (1 2 3 4 (5 6 3) 3 4)) 7 3)
'(1 (1 2 7 4 (5 6 7) 7 4))

> (replace '() 7 3)
'()

> (replace '(1 (1 2 3 4) 3 4) 7 3)
'(1 (1 2 7 4) 7 4)

或者:

(define (replace L new old)

  (if (list? L)
      (map
       (lambda (lst) (replace lst new old))
       L)
      (if (equal? L old)
      new
      L)))

例子:

(替换'(1 (1 2 3 4 (5 6 3) 3 4)) 7 3) -> '(1 (1 2 7 4 (5 6 7) 7 4))

于 2017-01-02T00:16:35.530 回答