gpt4 book ai didi

clojure - 请解释一下以下 Clojure 代码

转载 作者:行者123 更新时间:2023-12-03 00:21:44 25 4
gpt4 key购买 nike

我发现以下代码(在 this blog post 中解决了 Coin Changer Kata ):

(defn change-for [amount]
(let [denominations [25 10 5 1]
amounts (reductions #(rem %1 %2) amount denominations)
coins (map #(int (/ %1 %2)) amounts denominations)]
(mapcat #(take %1 (repeat %2)) coins denominations)))

我觉得困难的部分是:(减少#(rem %1 %2)金额面额)

据我所知,reductions只是根据某个给定的函数增量计算结果集合。示例:(reductions + [1 2 3]) 给出 [1 3 6]

1         ; first  element
1 + 2 ; second element
1 + 2 + 3 ; third element

下一个函数,rem计算余数仍然非常容易理解。

为了理解代码的其余部分,我尝试了以下操作:

; first try, to see if this call works
; outside the original code (the change-for function)
(reductions #(rem %1 %2) 17 [10 5 1]) ; --> [17 7 2 0]

; tried to use the reductions which takes only one argument
; notice that 17 is now inside the array
(reductions #(rem %1 %2) [17 10 5 1]) ; --> [17 7 2 0]

; further simplified the expression
(reductions rem [17 10 5 1]) ; --> [17 7 2 0]

最后一步是删除匿名函数,如 this blog post 中所述。 .

这里,事情变得令人困惑(至少对我来说):rem需要2个参数,但我不明白它们在使用数组时如何应用[17 10 5 1] 。我尝试了以下调用:

(rem [17 10 5 1]) ; --> gives error
(rem [17 10 5 1] [17 10 5 1]) ; --> also gives error
(rem 17 10) ; --> works, but how do you use it with collections?

有人可以向我解释一下这个 rem 函数如何与 reductions 函数一起使用吗?

我不太明白的另一件事是:如何应用这些百分比参数(在 #(rem %1 %2) 中)?我的意思是他们从哪里来?我尝试按以下方式调用 rem,但收到错误:(#(rem %1 %2) 17 [10 5 1])reductions 函数必须在幕后做一些事情才能完成这项工作,对吗?

起初我以为#(rem %1 %2)是一个集合。它们的声明方式与集合类似,并且很容易被误用(被刚开始使用 Clojure 的人误用):

(type #{1 2 3})   ; --> clojure.lang.PersistentHashSet
(type #(1 2 3)) ; --> user$eval12687$fn__12688

有人可以向我指出一个网站/书籍/任何可以解释 Clojure 技巧的内容,例如“匿名函数的特殊形式”吗?大多数资源只提供最简单的构造(与所有其他 lisp 衍生物类似的构造),而不涉及 Clojure 的复杂性。我发现a site看起来不错(也解释了我上面提到的匿名函数)。 还有其他此类资源吗?

最佳答案

这个:

(reductions #(rem %1 %2) amount denominations)

相当于:

(reductions rem amount denominations)

正如你所注意到的

(reductions function start collection) 

返回使用function约简collection的中间结果序列(将start作为第一步约简的第一个参数) 。 函数必须采用两个参数。

所以结果是:

(reductions function start [1 2 3 4 5]) 

((function start 1) (function (function start 1) 2) ...) 

#(rem %1 %2) 语法只是定义带有两个参数(%1%2),对它们调用 rem 并返回结果。

相当于:

(fn [a b] (rem a b))

关于clojure - 请解释一下以下 Clojure 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13990214/

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