Ракетка / Схема - Применение функции к каждому элементу в списке списков
Я - физик, изучаю математику с программированием (я записался на математику), но я никогда раньше не программировал на каком-либо языке, так что все, что касается Racket, для меня совершенно новое. Цель класса на данный момент - взять связанные с множеством функции и преобразовать их в программы Racket. Одна из этих функций - взять список списков и удалить первый элемент каждого элемента:
f ({(0, 1, 0), (1, 0, 0), (1, 1, 1)...} = {(1, 0), (0, 0), (1, 1)...}
Я получил это в качестве процедуры до сих пор:
(define (procA set)
(cond
((null? set) '())
((rest (first set)))
((procA (rest set)))))
Когда я запускаю программу, она возвращается с надлежащей примененной функцией, но только с первым элементом, например, как
(procA '((0 1 0) (1 0 0) (1 1 1)))
возвращается, чтобы быть '(1 0). Это какая-то функция "карты" или что-то совершенно другое? Я думал, что последняя строка позаботится об остальной части списка, но это не так.
1 ответ
Как прокомментировал @uselpa, он такой же, как map rest
, Если вы хотите реализовать это, вам нужно использовать рекурсию и cons
вместе полученный список.
Я думаю, что самым простым подходом является использование if
найти базовый случай пустого списка:
(define (procB set)
(if (null? set)
'()
(cons (rest (first set)) (procB (rest set)))))
Если вы хотите использовать cond
то же самое можно записать как
(define (procC set)
(cond
((null? set) '())
(else (cons (rest (first set)) (procC (rest set))))))
(где else
в этом случае нет необходимости: если пропущено, это также будет случай "тестовое выражение без тела", описанный ниже. NB Я имею в виду только удаление слова else
, а не выражение, следующее за ним.)
То есть единственное, чего не хватало в вашем коде, было cons
, В вашем коде последний оператор (с рекурсией) никогда не будет выполнен, так как cond
выбирает первое тестовое выражение, которое является истинным (и (rest non-empty-list)
это "правдивая" ценность. Аналогичный пример:
> (cond
((= 1 2) 0)
((+ 3 4))
((+ 5 6)))
7
где первое тестовое выражение ложно, поэтому оно переходит ко второму, что верно, и, поскольку оно не имеет тела, результат тестового выражения становится результатом cond
, Третье тестовое выражение никогда не выполняется.
(define (exclude list)
(if (empty? list) '""
(let ((r (rest list)) (f (rest (first list))))
(~a f (exclude r))
)))
(exclude '( (3 4 5) ( 6 7 8) ( 9 10 11)))
;(4 5)(7 8)(10 11)