Как Вы делаете этот хвост функции питания Haskell рекурсивным?

Как я сделал бы этот хвост функции питания Haskell рекурсивным?

turboPower a 0 = 1
turboPower a b
    | even b = turboPower (a*a) (b `div` 2)
    | otherwise = a * turboPower a (b-1)
9
задан NoviceCodingGeek 27 January 2015 в 18:24
поделиться

1 ответ

turboPower a b = turboPower' 1 a b
  where
    turboPower' x a 0 = x
    turboPower' x a b
        | x `seq` a `seq` b `seq` False = undefined
        | even b = turboPower' x (a*a) (b `div` 2)
        | otherwise = turboPower' (x*a) a (b-1)

По сути, вы хотите переместить умножение, которое вы делаете на шаге "otherwise" (поскольку именно это не дает ему изначально быть хвостовым рекурсивным) в другой параметр.

Отредактировано для добавления строки, делающей все три параметра строго оцениваемыми, а не ленивыми, поскольку это одна из тех хорошо известных ситуаций, когда лень может нам навредить.

10
ответ дан 4 December 2019 в 21:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: