我需要用 Scheme 中的另一个元素替换列表中的一个元素,但问题是我需要替换的列表可以嵌套。
例如,如果我有列表'(1 (2 3 4 5) (6 7))
并且需要将 5 替换为 9,那么我的输出应该是'(1 (2 3 4 9) (6 7))
.
你能帮我解决这个问题吗?
解决此类问题有一个基本策略:
这是一些骨架代码:
(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))
是支持子列表的版本中唯一的新内容。
这是一个功能:
(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))