Решение упражнения 2.21 из SICP
Еще одно несложное, но важное для понимания основ упражнение. Закончить определения процедуры square-list можно таким образом:
(define (square-list items) (if (null? items) nil (cons (square (car items)) (square-list (cdr items)))))
(define (square-list items) (map square items))
Как видите, использование процедуры обобщенного отображения списков здорово упрощает жизнь.
Хочу сделать замечание по синтаксису Scheme в отношении значения nil. Я пользуюсь DrScheme, в котором значение nil не определено. Вместо него есть null, обозначающее, по всей видимости, то же самое, что и nil в книге, а также синоним () для него, обозначающий пустой список, который иногда более удобно указывать при работе со списками. Для того, чтобы пример из книги отрабатывал as is, я определил nil как псевдоним для null:
(define nil null)
В дальнейшем в своих решениях я буду свободно пользоваться этими разными формами записи для семантически эквивалентных вещей, не обращая на них лишнего внимания.
Comments
Comment from Spok
Date: February 11, 2014, 3:02 pm
Тут также интересен итеративный вариант процедуры высшего порядка для обработки списков:
(define (mod proc nums)
(define (parser result remains)
(if (null? remains)
result
(parser (append result (list (proc (car remains))))
(cdr remains))))
(if (null? nums)
0
(parser (list (proc (car nums))) (cdr nums))))
Comment from Elder
Date: February 17, 2017, 2:39 pm
Как по мне, с использованием анонимных функций выглядит лучше :
(define (square-list items) (if (null? items) nil (cons ((lambda (x) (* x x)) (car items)) (square-list (cdr items))))) (define (square-list2 items) (map (lambda (x) (* x x)) items))
Write a comment