2013-04-06 76 views
0

我需要用Scheme中的另一個元素替換列表中的元素,但問題是我需要替換的列表可以嵌套。將元素替換爲列表方案

例如,如果我有清單'(1 (2 3 4 5) (6 7)),並且需要用9替換5,則我的輸出應爲'(1 (2 3 4 9) (6 7))

你能幫我解決這個問題嗎?

+0

嗯你有什麼嘗試? – 2013-04-07 03:00:40

回答

2

沒有爲解決這種問題基本策略:

  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)),是在你的子表功能的版本是新的嘛。

+0

我有沒有子列表的列表的功能。 (car lst)是一個列表,我不知道如何遞歸到函數中。 – pixie 2013-04-06 21:58:37

+0

好的,那很簡單。你知道你如何處理你正在替換的元素的情況,對嗎?你的答案應該是'(用(替換(cdr lst)from))''的形式。子列表案例的答案是相似的,只是「」的表達方式不同。 – 2013-04-06 22:01:34

+0

(提示:如果內部列表是一個扁平列表會怎樣?如果它不是實際平坦的,它會繼續工作嗎?) – 2013-04-06 22:03:39

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