首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure Koan阶乘函数实现

Clojure Koan阶乘函数实现
EN

Stack Overflow用户
提问于 2015-11-09 22:27:46
回答 2查看 232关注 0票数 5

我正在学习clojure,并且正在学习clojure-koan练习。其中一个练习是关于implementing a factorial function的。我在玩的时候注意到:

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

代码语言:javascript
复制
(defn factorial-1 [n]
   (loop [n n f 1]
      (if (= n 1)
          f
          (recur (dec n) (* f n)))))

在REPL中调用(factorial-1 1000N)将产生一个数字:402387260077093773...

然而,当我尝试以下惰性序列方法时:

代码语言:javascript
复制
(defn factorial-2 [n]
   (reduce * 1 (range 1 (inc n))))

在REPL中调用(factorial-2 1000N)将产生一个错误:

代码语言:javascript
复制
ArithmeticException integer overflow  clojure.lang.Numbers.throwIntOverflow (Numbers.java:1388)

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-10 01:53:51

或者您可以简单地使用*'函数。

代码语言:javascript
复制
(defn factorial-3 [n]
  (reduce *' (range 1 (inc n))))

*'函数支持任意精度。如果数字在Long的范围内,它将返回Long。如果范围超过了长期范围,它将返回BigInt

票数 5
EN

Stack Overflow用户

发布于 2015-11-09 23:17:37

即使超过1000 N,你也不会在乘法中使用任何bigints,因为你只使用这个数字来确定计算的结束。你在1开始乘法,然后乘以1,然后是2,等等。如果您修改factorial-2的定义以使用bigint,您将得到预期的行为:

代码语言:javascript
复制
(defn factorial-2 [n]
  (reduce * 1N (range 1 (inc n))))
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33619506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档