Как мне написать эту функцию Clojure, чтобы она не разбивала стек?

Я новичок в Clojure и думаю, что мой подход к написанию кода пока не соответствует «Пути Clojure». По крайней мере, я продолжаю писать функции, которые продолжают приводить к ошибкам StackOverflow с большими значениями. Я узнал об использовании recur, что стало хорошим шагом вперед. Но как заставить функции, подобные приведенной ниже, работать для таких значений, как 2500000?

(defn fib [i]
  (if (>= 2 i)
    1
    (+ (fib (dec i))
       (fib (- i 2)))))

Эта функция, на мой взгляд, является «простой» реализацией генератора Фибоначчи. Я видел другие реализации, которые намного более оптимизированы, но менее очевидны с точки зрения того, что они делают. Т.е. когда вы читаете определение функции, вы не говорите «о, фибоначчи».

Мы будем благодарны за любые указатели!

6
задан bitops 29 December 2011 в 17:52
поделиться