если всегда возвращает nil в Clojure

Я пытаюсь написать программу, которая проверяет, является ли число совершенным или не использует clojure. Я новичок в Clojure или любом другом функциональном языке программирования.

Когда я удаляю оператор if в 5-й строке, он работает нормально. Но мне нужно проверить, делю ли я число или нет. И это моя проблема. Пожалуйста, проверьте мою функцию ниже и скажите мне, почему она возвращает ноль. независимо от того, что я меняю, все равно возвращается ноль.

И если кто-то может идти построчно и объяснять, что делает каждая строка, это тоже поможет. Спасибо

(defn perfect [number]
   (loop [i 1 sum 0]
     (if (< i number)
       (recur (+ i 1)
              (if (= (mod number i) 0)
                (+ sum i)))
                sum)))

person Natnael    schedule 24.01.2016    source источник


Ответы (1)


if всегда имеет две ветви. Если вы предоставляете код только для одной ветки, другая просто возвращает nil. Вам нужно предоставить некоторое значение для возврата цикла в случае, если ветвь recur не выбрана.

Чтобы было ясно, несмотря на ваш заголовок, if внутри recur здесь не проблема, это if вне recur, возвращающее nil. И у нас нет утверждений в clojure, if — это выражение, как и все остальное.

person noisesmith    schedule 24.01.2016
comment
Теперь я понимаю, если выражение должно иметь два варианта. Спасибо - person Natnael; 25.01.2016