Добавление элемента в конец списка в схеме - PullRequest
1 голос
/ 14 мая 2019

Задано добавление a к концу (b c), чтобы сделать (b c a)

Пока я пытаюсь

(print (cons 'a '(b c))) 

, я получаю (a b c)

но когда я делаю

(print (cons '(b c) 'a)) 

, я получаю ((b c) . a)

Все другие подобные вопросы по стеку кажутся более сложными, чем эта проблема, поэтому мне было интересно, было ли легко исправить.

1 Ответ

1 голос
/ 14 мая 2019

Список представляет собой цепочку пар.Элементы - это машины каждой пары, cdr - это ссылка на следующую пару в цепочке, или пустой список для последней пары в цепочке.

Когда вы используете (cons 'a '(b c)), вы создаете новуюпара перед существующим списком (b c), поэтому результатом по-прежнему является список.

Но когда вы используете (cons '(b c) 'a), вы создаете пару, чей cdr является символом a, а несписок.И последняя пара в списке (b c) все еще имеет свой cdr, указывающий на пустой список.

Вам необходимо скопировать первый список, и когда вы доберетесь до конца, вы должны сделать так, чтобы cdr указывал насписок, содержащий a.Вы можете сделать это с помощью рекурсивной процедуры.

(define (list-append old-list new-el)
  (if (null? old-list) 
      (list new-el)
      (cons (car old-list) 
            (list-append (cdr old-list) new-el))))
(list-append '(b c) 'a)

Логика:

  • Если мы попытаемся добавить пустой список, просто вернем список, содержащий новый элемент
  • В противном случае добавьте новый элемент в конец исходного списка с помощью рекурсивного вызова, а затем поместите первый элемент перед ним (используя метод (cons new-element old-list), который вы показали в первом примере).
...