Clojure - Фибоначчи с использованием цикла recur - приходит в бесконечный цикл - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь получить числа Фибоначчи с помощью конструкции loop-recur:

(defn fibo-looprecur [x]
  (loop [current 0
         next 1
         result x]
       (if (= x 0) current (recur next (+' current next) (dec result))))
)

Когда я запускаю его, он работает нормально с 0, но когда я помещаю 1 в fibo-looprecur, он идет в бесконечный цикл. Что может вызвать такое поведение?

1 Ответ

0 голосов
/ 15 мая 2018

Clojure работает со значениями не ссылочными типами; другими словами, x и результат не указывают на одно и то же значение, но являются отдельными привязками. Когда вы уменьшаете результат, он не влияет на x, и поэтому вы никогда не достигнете базового значения x = 0.

Если вы измените свое состояние, чтобы проверить результат вместо x, вы получите ожидаемые результаты.

(defn fibo-looprecur [x]
  (loop [current 0
         next 1
         result x]
    (if (= result 0) current (recur next (+' current next) (dec result)))))

(map fibo-looprecur (range 10))
=> (0 1 1 2 3 5 8 13 21 34)
...