Я написал код для вычисления коэффициентов частного от деления двух бесконечных серий, используя сокращение, следующий образом:Более хекельский способ написать эту рекурсию?
main :: Int -> PInt
main 0 = 0
main n = cancel x3
where
x1 = someOtherFunction
x2 = expression involving x1
x3 = x2 - (foldr
(\y z -> z + (someOtherFunction y) * (main (n - y))) 0 [1..(n - 1)])
(Я определил данные под названием PInt, который является экземпляром Num и дробным, и есть вспомогательная функция «отменить» для выполнения сокращения.) Моя проблема заключается в выражении в сгибе в x3: она кажется не очень эффективной, так как она должна вычислять каждую основную k для более низких значений k.
Я имею в виду, может быть, я могу использовать реализацию таких как
fib = 1 : 1 : zipWith (+) fib (tail fib)
для чисел Фибоначчи вычислить рекурсию выше, что является более эффективным. К сожалению, я не знаю, с чего начать.
Благодарим за любую помощь заранее.
P.S. Код занимает значительное количество времени, чтобы вычислить значение в 20, какое поведение, по-видимому, подразумевает экспоненциальный рост времени?
http://codereview.stackexchange.com - лучшее место, чтобы попросить обзоры кода, который уже работает. –
Спасибо за информацию. – awllower
(Возможно, вы можете просто [memoize] (https://wiki.haskell.org/Memoization) 'main'.) – Lynn