我需要用Scheme中的另一個元素替換列表中的元素,但問題是我需要替換的列表可以嵌套。將元素替換爲列表方案
例如,如果我有清單'(1 (2 3 4 5) (6 7))
,並且需要用9替換5,則我的輸出應爲'(1 (2 3 4 9) (6 7))
。
你能幫我解決這個問題嗎?
我需要用Scheme中的另一個元素替換列表中的元素,但問題是我需要替換的列表可以嵌套。將元素替換爲列表方案
例如,如果我有清單'(1 (2 3 4 5) (6 7))
,並且需要用9替換5,則我的輸出應爲'(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))
,是在你的子表功能的版本是新的嘛。
我有沒有子列表的列表的功能。 (car lst)是一個列表,我不知道如何遞歸到函數中。 – pixie 2013-04-06 21:58:37
好的,那很簡單。你知道你如何處理你正在替換的元素的情況,對嗎?你的答案應該是'(用??>(替換(cdr lst)from))''的形式。子列表案例的答案是相似的,只是「??>」的表達方式不同。 – 2013-04-06 22:01:34
(提示:如果內部列表是一個扁平列表會怎樣?如果它不是實際平坦的,它會繼續工作嗎?) – 2013-04-06 22:03:39
這裏是一個功能:使用
(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))
嗯你有什麼嘗試? – 2013-04-07 03:00:40