将元素替换为列表Scheme

时间:2013-04-06 21:40:33

标签: list scheme racket

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

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

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

2 个答案:

答案 0 :(得分:3)

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

  1. 首先,解决它的平面列表。即,如果输入列表没有子列表,则编写函数以使其有效。
  2. 然后,添加一个条件,这样如果您正在检查的元素是一个列表,那么使用该列表递归到您的函数中。
  3. 这是一些骨架代码:

    (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))是您的子列表功能版本中唯一的新内容。

答案 1 :(得分:0)

这是一个函数:

(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) - &gt; '(1(1 2 7 4(5 6 7)7 4))