我正在尝试实现计算伯努利数的递归算法。但是,我得到“除以零”,我不知道为什么。所以我需要一些逻辑方面的帮助。
当使用 bernoulli 0 运行程序时,它会打印 1,因此 if 语句似乎有效。Bur not for arguments > 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
问题出在你的for
表达上:
(for [k (range n)] (/ (* (binom 1 n k) (bernoulli k)) (- n (+ k 1))))
特别是,该部门:
(/ (* (binom 1 n k) (bernoulli k))
(- n (+ k 1)))
最后一部分,whenn
是 1 且 k 是 0(这是n
在入口为 1时会发生的情况),然后(- n (+ k 1))
计算(- 1 (+ 0 1))
结果为 0。结果,您最终除以 0。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句