Решение упражнения 2.26 из SICP

28 January, 2008 (20:44) | Решения упражнений

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

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