Существует простой способ отличить итеративный процесс от рекурсивного, спросите себя: остается ли что-нибудь сделать после рекурсивного вызова? Если ответ да, то это рекурсивный процесс, вот что здесь происходит:
(inc (+ (dec a) b))
^
this is invoked after the recursive call
Если ответ отрицательный, то это итеративный процесс, который происходит здесь:
(+ (dec a) (inc b))
^
the recursive call is the last thing we do
Во втором случае мы говорим, что +
находится в хвостовой позиции, и поддерживающий его интерпретатор оптимизирует его, см .: tail call . Clojure не может выполнить оптимизацию хвостового вызова, если вы не используете recur
.