Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion 使列表的当前函数递归Clojure_Recursion_Clojure - Fatal编程技术网

Recursion 使列表的当前函数递归Clojure

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 我曾尝试将其实现为递归函数,但一点运气都没

嗨,我正在寻找一些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]
   (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语言写过。我需要学习的还有很多,我知道我可以简单地将我的大部分函数转换成一行程序,但我不知道所有的内置方法都做了什么。