【发布时间】:2017-04-03 11:35:22
【问题描述】:
我正在尝试使用 memoization 在位置 400 处打印斐波那契数的值。起初,我只能打印到第 94 位的数字,因为出现整数溢出错误。在线阅读后,我现在可以通过转换为 BigInt 将值打印到位置 247。但是由于某种原因,当我尝试 248 或更高版本时,我得到了一个巨大的错误。这是我的代码:
(def m-fib
(memoize (fn [n]
(condp = n
0N 0N
1N 1N
(+ (m-fib (dec n)) (m-fib (- n 2)))))))
(println(m-fib 248N))
这是我得到的错误示例(将所有这些都放入问题中太长了,它不会具体告诉我问题是什么。
at clojure.lang.AFn.applyToHelper(AFn.java:154)
at clojure.lang.AFn.applyTo(AFn.java:144)
at clojure.core$apply.invokeStatic(core.clj:646)
at clojure.core$memoize$fn__5708.doInvoke(core.clj:6107)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at fibonacci.core$_main$fn__28.invoke(core.clj:11)
at clojure.lang.AFn.applyToHelper(AFn.java:154)
at clojure.lang.AFn.applyTo(AFn.java:144)
at clojure.core$apply.invokeStatic(core.clj:646)
at clojure.core$memoize$fn__5708.doInvoke(core.clj:6107)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at fibonacci.core$_main$fn__28.invoke(core.clj:11)
at clojure.lang.AFn.applyToHelper(AFn.java:154)
at clojure.lang.AFn.applyTo(AFn.java:144)
at clojure.core$apply.invokeStatic(core.clj:646)
at clojure.core$memoize$fn__5708.doInvoke(core.clj:6107)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at fibonacci.core$_main$fn__28.invoke(core.clj:11)
at clojure.lang.AFn.applyToHelper(AFn.java:154)
at clojure.lang.AFn.applyTo(AFn.java:144)
at clojure.core$apply.invokeStatic(core.clj:646)
at clojure.core$memoize$fn__5708.doInvoke(core.clj:6107)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at fibonacci.core$_main$fn__28.invoke(core.clj:11)
at clojure.lang.AFn.applyToHelper(AFn.java:154)
at clojure.lang.AFn.applyTo(AFn.java:144)
at clojure.core$apply.invokeStatic(core.clj:646)
at clojure.core$memoize$fn__5708.doInvoke(core.clj:6107)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at fibonacci.core$_main$fn__28.invoke(core.clj:11)
at clojure.lang.AFn.applyToHelper(AFn.java:154)
at clojure.lang.AFn.applyTo(AFn.java:144)
我怎样才能解决这个问题并在位置 400 处输出 fib 值而不会出现任何错误?
【问题讨论】:
-
对于尾递归斐波那契,看at this SO question
标签: clojure