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

26 January, 2008 (19:42) | Разное

Еще одно несложное, но важное для понимания основ упражнение. Закончить определения процедуры 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