gpt4 book ai didi

loops - 这两个 Clojure 代码块有什么区别?

转载 作者:行者123 更新时间:2023-12-02 08:48:14 26 4
gpt4 key购买 nike

在处理 Clojure Koans 时,我不得不反复计算一个数的阶乘,我确实找到了解决方案,但我对 2 种解决方案之间的区别有疑问,一种有效,另一种无效,尽管我不明白为什么:

有效的方法:

(defn factorial [n]
(loop [n n
acc 1]
(if (zero? n)
acc
(recur (dec n) (* n acc )))
)

没有的:

(defn factorial [n]
(loop [n n
acc 1]
(if (zero? n)
1
(recur (dec n) (* n acc )))
)

请注意,唯一的区别是满足条件时 If block 的返回值。

最佳答案

第二个factorial 函数总是返回1。代码构建为使用累加器变量 (acc),第一个代码块通过返回此累加器变量使其正确。

factorial 函数可以编写为返回 1,但是,如果不使用累加器变量。由于此方法不使用loop/recur,因此很容易导致堆栈溢出:尝试(fact 5000)

(defn factorial [x]
(if (<= x 1)
1
(* x (factorial (- x 1)))))

( source )

关于loops - 这两个 Clojure 代码块有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10786622/

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