gpt4 book ai didi

recursion - 在 Clojure 中递归求和所有三的倍数

转载 作者:太空宇宙 更新时间:2023-11-03 18:46:12 24 4
gpt4 key购买 nike

您好,我对 Clojure/Lisp 编程有点陌生,但我之前在类似 C 的语言中使用过递归,我编写了以下代码来对 1 到 100 之间所有可以被三除的数字求和。

(defn is_div_by_3[number]
(if( = 0 (mod number 3))
true false)
)

(defn sum_of_mult3[step,sum]
(if (= step 100)
sum
)
(if (is_div_by_3 step)
(sum_of_mult3 (+ step 1 ) (+ sum step))
)
)

我的想法是在 step 达到总和时结束递归,然后我将在返回的总和变量中得到我需要的所有倍数,但是我的 REPL 似乎对两个变量都返回 nil 这里可能有什么问题?

最佳答案

if表达式而不是语句if 的结果始终是分支之一。事实上,Clojure 没有声明 here :

Clojure programs are composed of expressions. Every form not handled specially by a special form or macro is considered by the compiler to be an expression, which is evaluated to yield a value. There are no declarations or statements, although sometimes expressions may be evaluated for their side-effects and their values ignored.

有一本适合初学者的不错的在线(免费)书籍:http://www.braveclojure.com

另外,Lisp 中的圆括号不等同于 C 系列语言中的大括号。例如,我会将您的 is_div_by_3 函数编写为:

(defn div-by-3? [number]
(zero? (mod number 3)))

我还会对 sum_of_mult3 函数使用更惯用的方法:

(defn sum-of-mult-3 [max] 
(->> (range 1 (inc max))
(filter div-by-3?)
(apply +)))

我认为这段代码比递归版本更能表达其意图。唯一的技巧是 ->>线程最后一个宏。看看this answer线程最后一个宏的解释。

关于recursion - 在 Clojure 中递归求和所有三的倍数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28415561/

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