2013-04-06 2 views
0

Мне нужно заменить элемент из списка на другой элемент в Схеме, но проблема в том, что список, в котором мне нужно заменить, может быть вложенным.Замена элемента в список Схема

Например, если у меня есть список '(1 (2 3 4 5) (6 7)), и мне нужно заменить 5 на 9, мой вывод должен быть '(1 (2 3 4 9) (6 7)).

Не могли бы вы помочь мне с этой проблемой?

+0

um Что вы пробовали? –

ответ

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

+0

Хорошо, это легко. Вы знаете, как вы обрабатывали случай, когда вы соответствуете элементу, который вы заменяете, не так ли? Ваш ответ должен иметь форму '(cons (заменить (cdr lst) from to))'. Ответ на подобъект подобен, просто с другим выражением для ''. –

+0

(Подсказка: что, если внутренний список был плоским списком? Что бы вы использовали для ''? Он будет работать, если бы он не был плоским?) –

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))

Смежные вопросы