#functional-programming #scheme #lisp #racket
#функциональное программирование #схема #lisp #ракетка
Вопрос:
Я пытаюсь использовать функцию reduce более сложным способом, чем для чего она обычно предназначена. Я даже не уверен, возможно ли это, но вот что я пытаюсь сделать:
Учитывая список (1 2 3)
и две константы, пусть они будут 9
и 13
, я пытаюсь использовать reduce, чтобы в итоге получить:
( 1 (* 9 ( 2 (* 9 ( 3 (* 9 13))))))
Я попробовал метод, в котором я добавил 13 в конец списка, поэтому (1 2 3 13)
затем я попытался выполнить некоторое сопоставление с помощью Lambda и reduce, но я не могу получить правильный ответ.
Я бы опубликовал свой код, который я пробовал, но у меня отключился Интернет, и я набираю это на своем телефоне, так что извините, я не могу показать, что я пытался сделать, но цель — это форма приведенного выше выражения с использованием reduce
Ответ №1:
Предлагаемые операции действительно могут быть реализованы как reduce
(он же foldr
):
( 1 (* 9 ( 2 (* 9 ( 3 (* 9 13))))))
=> 9739
(reduce (lambda (e acc) ( e (* 9 acc)))
13
'(1 2 3))
=> 9739
Что касается констант, 13
используется только один раз во внутреннем выражении, поэтому его вполне можно использовать в качестве начального значения. 9
используется для умножения накопленного значения. Список входных данных используется справа налево, когда рекурсия начинает раскручиваться, и в этот момент мы добавляем текущий элемент к накопленному результату.
Комментарии:
1. И чтобы найти правильную форму во время разработки, вы можете попробовать что-то вроде
(lambda (x acc) `( ,x (* 9 ,acc)))
.