recursion - 如何在 clojure 中调用 2 个连续函数?

标签 recursion clojure

我正在尝试在 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。它不适合 condif 因为这是我想在执行另一个功能上不相关的步骤后调用的步骤。

我可能弄错了,但我只想在更新 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/

相关文章:

clojure - 为什么 Clojure 在创建新的命名空间后不提供标准库?

clojure - 为什么我可以在 Clojure 中更改不可变变量?

clojure - 使用 gen-class 时如何获取类的实例

java - 为什么这个递归函数只设置一次?

clojure - 在 Clojure 中如何迭代直到达到固定点?

python - Python 中的递归函数

javascript - 需要一些帮助来理解递归

clojure:覆盖函数应用程序

algorithm - 有趣的递归函数

java - 为什么静态成员变量不适用于递归方法中的保留值?