我正在尝试在 https://iloveponies.github.io/120-hour-epic-sax-marathon/recursion.html 上做练习 20 。这是我的代码:
(defn my-frequencies-helper [freqs a-seq]
(let [first-elem (first a-seq)
rest-of-seq (rest a-seq)]
(if (nil? first-elem)
freqs
(if (contains? freqs first-elem)
(assoc freqs first-elem (inc (get freqs first-elem)))
(assoc freqs first-elem 1)))))
(defn my-frequencies [a-seq]
(my-frequencies-helper {} a-seq))
问题是这不是递归的。不知何故,在更新 freqs
map 后,我需要将以下行添加到 my-frequencies-helper
中:
(my-frequencies-helper freqs rest-of-seq)
由于它不依赖于 if
函数的分支,因此我不知道如何在不向 if
函数添加太多参数的情况下执行此操作。 IE。它不适合 cond
或 if
因为这是我想在执行另一个功能上不相关的步骤后调用的步骤。
我可能弄错了,但我只想在更新 map 后递归调用 my-frequencies-helper
,即在 python 中,如下所示:
freqs[first-elem] = freqs[first-elem] + 1
my-frequencies-helper(freqs, rest-of-seq) # just another step to execute
我如何将其应用到我的代码中(或者更可能的是,另一种简单的方法来解决这个问题)?
最佳答案
借助解构,我们可以大大简化这段代码:
(defn my-frequencies-helper
[freqs [first-elem & rest-of-seq :as a-seq]]
(if (empty? a-seq)
freqs
(let [updated-freqs (if (contains? freqs first-elem)
(assoc freqs first-elem (inc (get freqs first-elem)))
(assoc freqs first-elem 1))]
(my-frequencies-helper updated-freqs rest-of-seq))))
此外,还有一个常见的习语
(if (contains? freqs first-elem)
(assoc freqs first-elem (inc (get freqs first-elem)))
(assoc freqs first-elem 1))
只要您不将 nil 存储在数字之一的位置,以下内容是等效的:
(update-in freqs [first-elem] (fnil inc 0))
这给我们留下了以下简化的函数:
(defn my-frequencies-helper
[freqs [first-elem & rest-of-seq :as a-seq]]
(if (empty? a-seq)
freqs
(my-frequencies-helper (update-in freqs [first-elem] (fnil inc 0)) rest-of-seq)))
关于recursion - 如何在 clojure 中调用 2 个连续函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25291538/