Решение упражнения 2.26 из SICP
В этом упражнении рассматриваются три доступные нам на данный момент операции для конструирования списков. Задача упражнения – твердо осознать разницу между этими операциями и применять ту или иную из них именно тогда, когда нужно.
append объединяет элементы списков в один список, приписывая второй список позади первого:
(1 2 3 4 5 6)
cons возвращает список, состоящий из элементов второго списка в начало которого добавлен первый список как один элемент:
((1 2 3) 4 5 6)
list строит новый список из двух элементов, первый из которых является первым исходным списком, а второй – вторым:
((1 2 3) (4 5 6))
Очень рекомендую изобразить рядом два исходных списка с помощью стрелочных диаграмм и, дорисовав еще по одной паре для каждого случая, получить результаты применения append, cons и list.
Comments
Comment from Максим
Date: November 26, 2014, 5:18 pm
Почему процедура для упражнения 2.27 выдаёт ошибку? Процесс протекает верно, но он отказывается соединять два списка в один! В случае с cons получается не совсем верный ответ – ((4 3) 2 1).
(define (deep-reverse-2 list)
(define (deep-iter list result)
(if (null? list)
result
(if (list? (car list))
(list (deep-iter (car (cdr list)) result)
(deep-iter (car list) null))
(deep-iter (cdr list) (cons (car list) result)))))
(deep-iter list null))
Comment from Максим
Date: November 26, 2014, 5:32 pm
Уже сколько раз расписывал substitution model и на бумаге всё отлично, а интерпретатор бузит…
0) ((1 2) (3 4))
1) list? (1 2)
2) list (deep-iter (3 4) null) ;; сначала интерпретатор вычисляет первый оператор
(deep-iter (1 2) null) ;; затем второй
3-a)
deep-iter (4) (3)
deep-iter null (4 3)
result <- (4 3)
3-b)
deep-iter (2) (1)
deep-iter null (2 1)
result <- (2 1)
4)
(list ‘(4 3) ‘(2 1)) – в чём ошибка?
Write a comment