Recursion 使列表的当前函数递归Clojure
嗨,我正在寻找一些Clojure代码的帮助。我已经编写了一个函数,它将接收一个列表并计算列表的数量*价格,例如'(pid3 6 9) 我想要的是扩展我的当前函数,以便它递归地进行数量*价格计算,直到到达列表的末尾 我当前的函数是这样写的:Recursion 使列表的当前函数递归Clojure,recursion,clojure,Recursion,Clojure,嗨,我正在寻找一些Clojure代码的帮助。我已经编写了一个函数,它将接收一个列表并计算列表的数量*价格,例如'(pid3 6 9) 我想要的是扩展我的当前函数,以便它递归地进行数量*价格计算,直到到达列表的末尾 我当前的函数是这样写的: (defn pid-calc [list] (* (nth list 1) (nth list 2))) (pid-calcc '( (pid1 8 5) (pid2 5 6)) return==> 70 我曾尝试将其实现为递归函数,但一点运气都没
(defn pid-calc [list] (* (nth list 1) (nth list 2)))
(pid-calcc '( (pid1 8 5) (pid2 5 6))
return==> 70
我曾尝试将其实现为递归函数,但一点运气都没有,我希望能够调用如下内容:
(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))))))
您不需要递归函数。只需使用
+
和地图
:
(defn pid-calc [list]
(letfn [(mul [[_ a b]] (* a b))]
(apply + (map mul list))))
,适当更正,是一种简洁、快速的解决问题的方法。它向你展示了很多
您尝试递归解决方案的尝试可以改进为
(defn pid-calc [list]
(if (empty? list)
0
(let [x (first list)]
(+ (* (nth x 1) (nth x 2)) (pid-calc (next list))))))
这在本例中是有效的,但是如果是正确的递归,那么足够长的列表上的堆栈空间就会用完。限额通常为10万件左右
我们可以克服这一点,而不必像“树懒”那样简洁。您可能会发现以下内容更容易理解:
(defn pid-calc [list]
(let [line-total (fn [item] (* (nth item 1) (nth item 2)))]
(apply + (map line-total list))))
非常适合您的场景:
(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)
定义
列表计算
,例如(fn[[a b]](*a b))
@Thumbnail谢谢。OP编辑了他的问题并删除了列表计算的定义,因此我编辑了我的答案以反映这一点。感谢您的帮助,我刚刚开始使用clojure。我只真正用OO语言写过。我需要学习的还有很多,我知道我可以简单地将我的大部分函数转换成一行程序,但我不知道所有的内置方法都做了什么。