Деление на ноль в Clojure - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь реализовать рекурсивный алгоритм вычисления чисел Бернулли. Но я получаю «деление на ноль» и не могу понять, почему. Поэтому мне нужна помощь с логикой.

При запуске программы с bernoulli 0 она печатает 1, поэтому оператор if работает. Но не для аргументов> 0

Спасибо за вашу помощь!

(defn binom [r, n, k]
  (if (= k 0) r ;Om k == 0, returnera r
  (binom (* r (/ (- n (+ k 1)) k )) n (- k 1))
))

(defn bernoulli [n]
  (if (= n 0) 1
    (- 1 (apply + (for [k (range n)] (/ (* (binom 1 n k) (bernoulli k)) (- n (+ k 1)))))))
  )

(println (bernoulli 4))

И я получаю сообщение об ошибке:

Exception in thread "main" java.lang.ArithmeticException: Divide by zero, compiling:(/afs/kth.se/home/f/d/fdiffner/Desktop/X2/bernoulli.clj:9:4)
    at clojure.lang.Compiler.load(Compiler.java:7145)
    at clojure.lang.Compiler.loadFile(Compiler.java:7089)
    at clojure.main$load_script.invoke(main.clj:274)
    at clojure.main$script_opt.invoke(main.clj:336)
    at clojure.main$main.doInvoke(main.clj:420)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clojure.lang.Var.invoke(Var.java:379)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.Var.applyTo(Var.java:700)
    at clojure.main.main(main.java:37)
Caused by: java.lang.ArithmeticException: Divide by zero
    at clojure.lang.Numbers.divide(Numbers.java:156)
    at user$bernoulli$iter__2__6$fn__7$fn__8.invoke(bernoulli.clj:8)
    at user$bernoulli$iter__2__6$fn__7.invoke(bernoulli.clj:8)
    at clojure.lang.LazySeq.sval(LazySeq.java:40)
    at clojure.lang.LazySeq.seq(LazySeq.java:49)
    at clojure.lang.RT.seq(RT.java:484)
    at clojure.core$seq.invoke(core.clj:133)
    at clojure.core$apply.invoke(core.clj:624)
    at user$bernoulli.invoke(bernoulli.clj:8)
    at user$bernoulli$iter__2__6$fn__7$fn__8.invoke(bernoulli.clj:8)
    at user$bernoulli$iter__2__6$fn__7.invoke(bernoulli.clj:8)
    at clojure.lang.LazySeq.sval(LazySeq.java:40)
    at clojure.lang.LazySeq.seq(LazySeq.java:49)
    at clojure.lang.RT.seq(RT.java:484)
    at clojure.core$seq.invoke(core.clj:133)
    at clojure.core$apply.invoke(core.clj:624)
    at user$bernoulli.invoke(bernoulli.clj:8)
    at user$eval17.invoke(bernoulli.clj:11)
    at clojure.lang.Compiler.eval(Compiler.java:6706)
    at clojure.lang.Compiler.load(Compiler.java:7133)
    ... 9 more

1 Ответ

4 голосов
/ 20 мая 2019

Проблема в вашем for выражении:

(for [k (range n)] (/ (* (binom 1 n k) (bernoulli k)) (- n (+ k 1))))

В частности, деление:

(/ (* (binom 1 n k) (bernoulli k))
   (- n (+ k 1)))

Последняя часть, когда n равен 1, а k равно 0 (что будет, когда n равно 1 при входе), тогда (- n (+ k 1)) оценивается как (- 1 (+ 0 1)), что равно 0. В результате , вы получите деление на 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...