Ракетный комплекс понижающей функции - PullRequest
2 голосов
/ 10 марта 2019

Я пытаюсь использовать функцию Reduce более сложным способом, чем то, для чего она обычно предназначена. Я даже не уверен, возможно ли это, но вот что я пытаюсь сделать:

Учитывая список (1 2 3) и две константы, пусть они будут 9 и 13, я пытаюсь использовать сокращение, чтобы в итоге получить:

(+ 1 (* 9 (+ 2 (* 9 (+ 3 (* 9 13))))))

Я попробовал метод, в котором я добавил 13 в конец списка, поэтому у меня был (1 2 3 13), затем я попытался сделать некоторые отображения с помощью Lambda и Reduce, но я не могу получить правильный ответ.

Я бы опубликовал свой код, который я пробовал, но у меня отключился интернет, и я набираю это на своем телефоне, так что извините, я не могу показать, что я пытался сделать, но цель - форма выражения выше, используя уменьшение

1 Ответ

3 голосов
/ 10 марта 2019

Предлагаемые операции действительно могут быть реализованы как reduce (a.k.a. foldr):

(+ 1 (* 9 (+ 2 (* 9 (+ 3 (* 9 13))))))
=> 9739

(reduce (lambda (e acc) (+ e (* 9 acc)))
        13
        '(1 2 3))
=> 9739

Что касается констант, 13 используется только один раз в самом внутреннем выражении, так что это подходит для использования в качестве начального значения. 9 используется для умножения накопленного значения. Список ввода используется справа налево, когда рекурсия начинает раскручиваться, и в этот момент мы добавляем текущий элемент к накопленному результату.

...