我需要用Scheme中的另一个元素替换列表中的元素,但问题是我需要替换的列表可以嵌套。
例如,如果我有列表'(1 (2 3 4 5) (6 7))
并且我需要用9替换5,那么我的输出应该是'(1 (2 3 4 9) (6 7))
。
你能帮我解决这个问题吗?
答案 0 :(得分: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))