Как назвать lazy-seq, сделанный до сих пор в рамках построения lazy-seq? - PullRequest
3 голосов
/ 13 июня 2011

Для моих простых чисел lazy seq я проверяю, делится ли значение индекса на все простые числа ниже этого текущего индекса (prime?).Проблема в том, что когда я вызываю простые числа внутри себя (primes в строке shr-primes), он возвращает только начальное значение.Можно ли обновлять lazy-seq при его ленивом построении?Это кажется нелогичным для концепции lazy-seq.

(def primes
  (cons 2 (for [x           (range)
                  :let  [y                      (-> x (* 2) (+ 3))
                        root                    (math/floor (math/sqrt y))
                        shr-primes      (take-while (partial >= root) primes)   ;; primes stuck at init value
                        prime?              (every? #(not= % 0) (pmap #(rem y %) shr-primes))]
                  :when prime?]
              y)))

1 Ответ

2 голосов
/ 14 июня 2011

Если вы решаете проблемы с Project Euler, я не хочу портить вам это упражнение, но вот как вы бы определили последовательность Фибоначчи, чтобы lazy-seq продолжал «обновляться» сам по себе:

(defn fib-maker
  ([] (concat [0 1] (fib 0 1)))
  ([a b] (lazy-seq (cons b (fib b (+ a b))))))

(def fib (fib-maker))

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

...