Функция уменьшения комплекса ракеток

#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))) .