gpt4 book ai didi

clojure - 递归调用导致溢出

转载 作者:行者123 更新时间:2023-12-02 18:39:16 25 4
gpt4 key购买 nike

我正在尝试解决项目欧拉第二个问题。为什么下面的代码会导致堆栈溢出?我正在使用 recur,因此它不应该将所有递归调用存储在堆栈上。

(defn sum
[[a b]]
[b (+ a b)])

(defn fib-r
([n] (fib-r n 0 [0 1]))
([n s [a b]]
(if (= n 0)
s
(let [[c d] (sum [a b])
e (if (even? c) c 0)
f (+ s e)]
(recur (dec n) f [c d])))))

(fib-r 4000000)

最佳答案

您遇到整数溢出(而不是堆栈溢出)如果您使用 BigInts(BigInt 文字以 N 结尾),那么 Clojure 将愉快地计算出正确的结果:

(defn fib-r                                                                                          
([n] (fib-r n 0N [0N 1N]))
([n s [a b]]
(if (= n 0N)
s
(let [[c d] (sum [a b])
e (if (even? c) c 0N)
f (+ s e)]
(recur (dec n) f [c d])))))
#'autotestbed.core/fib-r
autotestbed.core> (fib-r 40000)
1158997879999727672946417013062336891791160667328280503727448.... big number

关于clojure - 递归调用导致溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11130540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com