Я выполняю задачу Project Euler в Clojure и хочу найти сумму всех четных чисел в последовательности Фибоначчи до определенного числа.
Код функции, которая это делает, приведен ниже. Я знаю, что есть более быстрые и простые способы сделать это, я просто экспериментирую с рекурсией, используя цикл и повторение. Однако код, похоже, не работает, он никогда не возвращает ответ.
(defn fib-even-sum [upto]
(loop [previous 1 nxt 1 sum 0]
(if (or (<= upto 1) (>= nxt upto))
sum)
(if (= (mod nxt 2) 0)
(recur nxt (+ previous nxt) (+ sum nxt))
(recur nxt (+ previous nxt) sum))))
Я не был уверен, смогу ли я повторяться дважды в одном и том же цикле или нет. Я не уверен, что это вызывает проблему?
fibs
в'clojure.contrib.lazy-seqs
, что довольно быстро. При этом задача может быть выражена следующим образом:(reduce + (filter #(even? %) (take-while #(< % 4000000) (fibs))))
.. некоторые другие задачи Эйлера также можно решить в виде одной строки, наслаждайтесь! :-) - person klang   schedule 24.06.2011(defn fib0 [] (map ...))
и вызовите fib0 всякий раз, когда вам нужна новая копия последовательности. - person amalloy   schedule 28.11.2011