gpt4 book ai didi

recursion - Clojure Koan 阶乘函数实现

转载 作者:行者123 更新时间:2023-12-03 08:22:57 24 4
gpt4 key购买 nike

我正在学习 clojure 并通过 clojure-koan练习。其中一个练习是关于implementing a factorial function .在玩的过程中,我发现:

我的递归实现似乎适用于大数:

(defn factorial-1 [n]
(loop [n n f 1]
(if (= n 1)
f
(recur (dec n) (* f n)))))

调用 (factorial-1 1000N)在 REPL 中产生一个数字: 402387260077093773...
但是,当我尝试以下惰性序列方法时:
(defn factorial-2 [n]
(reduce * 1 (range 1 (inc n))))

调用 (factorial-2 1000N)在 REPL 中产生错误:
ArithmeticException integer overflow  clojure.lang.Numbers.throwIntOverflow (Numbers.java:1388)

为什么看似懒惰的序列方法会导致整数溢出错误?

最佳答案

尽管通过了 1000N,但您实际上从未在乘法中使用任何 bigint,因为您仅使用该数字来确定计算的结束。您从 1 开始乘法,然后乘以 1 ,然后 2 , 等等。如果您修改了 factorial-2 的定义要使用 bigint,您会得到预期的行为:

(defn factorial-2 [n]
(reduce * 1N (range 1 (inc n))))

关于recursion - Clojure Koan 阶乘函数实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33619506/

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