【问题标题】:Making current function of list recursive Clojure制作列表递归Clojure的当前功能
【发布时间】:2015-10-30 12:16:43
【问题描述】:

您好,我正在寻找有关 Clojure 代码的一些帮助。我编写了一个函数,它将接收一个列表并计算一个列表的 qty*price,例如。 '(pid3 6 9)

我正在寻找的是扩展我当前的函数,以便它递归地进行 qty*price 计算,直到它到达列表的末尾。

我现在的函数是这样写的:

(defn pid-calc [list] (* (nth list 1) (nth list 2)))

我尝试将其实现为递归函数,但完全没有运气,我希望能够调用这样的东西:

(pid-calcc '( (pid1 8 5) (pid2 5 6))
 return==> 70

这与我得出的答案一样接近,但似乎找不到答案。如果有人可以帮助我找到解决方案,那就太好了。到目前为止,我还没有找到任何可以编译的东西。

​(defn pid-calc [list]
   (if(empty? list)
    nil
    (* (nth list 1) (nth list 2)(+(pid-calc (rest list))))))

【问题讨论】:

    标签: recursion clojure


    【解决方案1】:

    您不需要递归函数。只需使用+map

    (defn pid-calc [list]
      (letfn [(mul [[_ a b]] (* a b))]
        (apply + (map mul list))))
    

    【讨论】:

    • 定义list-calc,比如(fn [[_ a b]] (* a b))
    • @Thumbnail 谢谢。 OP 编辑​​了他的问题并删除了list-calc 的定义,所以我编辑了我的答案以反映这一点。
    【解决方案2】:

    @sloth's answer,经过适当更正,是解决您的问题的简洁而快速的方法。它向你展示了很多东西。

    您对递归解决方案的尝试可以(a)修改为

    (defn pid-calc [list]
       (if (empty? list)
        0
        (let [x (first list)]
          (+ (* (nth x 1) (nth x 2)) (pid-calc (next list))))))
    

    这适用于示例,但是 - 正确递归 - 将在足够长的列表中耗尽堆栈空间。限制通常约为 10K 项。

    我们可以克服这个问题,而不必像 @sloth 那样简洁。您可能会发现以下内容更容易理解:

    (defn pid-calc [list]
      (let [line-total (fn [item] (* (nth item 1) (nth item 2)))]
        (apply + (map line-total list))))
    

    【讨论】:

    • 感谢您的帮助,我刚刚开始使用 clojure。我只真正用 OO 语言编写过。我需要学习的东西还有很多,我知道我几乎可以将我的大部分功能简单地放在一个衬垫上,但我还不知道所有内置方法的作用。
    【解决方案3】:

    reduce 非常适合您的场景:

    (def your-list [[:x 1 2] [:x 1 3]])
    
    (reduce #(+ %1 (* (nth %2 1) (nth %2 2))) 0 your-list)
    
    (reduce #(+ %1 (let [[_ a b] %2] (* a b)) 0 your-list)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      • 2019-04-14
      • 2011-12-24
      • 1970-01-01
      • 2012-10-25
      • 2018-07-20
      • 1970-01-01
      相关资源
      最近更新 更多