Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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 add函数_Recursion_Clojure - Fatal编程技术网

Recursion 使用递归创建clojure add函数

Recursion 使用递归创建clojure add函数,recursion,clojure,Recursion,Clojure,我正试图用clojure来处理递归。下面的代码出现堆栈溢出错误,有人能发现问题吗 我知道这是低效的,但严格来说是为了学习 user=> (defn addall ([] 0) ([& x] (if (empty? x) 0) (+ (first x) (addall (rest x))))) user/addall user=> (addall 1) StackOverflowError cl

我正试图用clojure来处理递归。下面的代码出现堆栈溢出错误,有人能发现问题吗

我知道这是低效的,但严格来说是为了学习

user=> (defn addall
         ([] 0)
         ([& x]
           (if (empty? x) 0)
           (+ (first x) (addall (rest x)))))
user/addall
user=> (addall 1)
StackOverflowError   clojure.lang.ArraySeq.next (ArraySeq.java:78)

看起来你的括号错了-你的if需要一个else表单。我猜你的意思是:

(defn addall
  ([] 0)
  ([& x]
     (if (empty? x) 
         0   ;;; <=== no ')' after 0
         (+ (first x) (addall (rest x))))))  ;;; <== extra ')' here
这实际上在我的电脑上产生了一个故障

此外,它有两个基本情况。我建议这样做:

(defn addall
  [xs]
  (if (empty? xs) 
      0
      (+ (first xs) 
         (addall (rest xs)))))
要使用向量调用:

(addall [1 2 3])
或者,如果要使用可变函数,还需要应用:


也就是说,您应该注意Clojure没有尾部调用优化,这意味着该代码在中等大小的输入中会失败。Clojure鼓励使用循环/重复和内置的序列处理函数。

看起来你的括号错了-你的if需要一个else表单。我猜你的意思是:

(defn addall
  ([] 0)
  ([& x]
     (if (empty? x) 
         0   ;;; <=== no ')' after 0
         (+ (first x) (addall (rest x))))))  ;;; <== extra ')' here
这实际上在我的电脑上产生了一个故障

此外,它有两个基本情况。我建议这样做:

(defn addall
  [xs]
  (if (empty? xs) 
      0
      (+ (first xs) 
         (addall (rest xs)))))
要使用向量调用:

(addall [1 2 3])
或者,如果要使用可变函数,还需要应用:


也就是说,您应该注意Clojure没有尾部调用优化,这意味着该代码在中等大小的输入中会失败。Clojure鼓励使用循环/重现和内置序列处理功能。

我认为这正是您想要的:

(defn addall ([x] (if (empty? x) 0 (+ (first x) (addall (rest x))))))
正如Matt Fenwick所提到的,您应该使用loop/recur。更惯用的方法是使用reduce:

(reduce + [1 2 3 4 5])

clojure中有很多很棒的工具,通常不需要循环/递归或显式递归之类的东西

我想这就是你想要的:

(defn addall ([x] (if (empty? x) 0 (+ (first x) (addall (rest x))))))
正如Matt Fenwick所提到的,您应该使用loop/recur。更惯用的方法是使用reduce:

(reduce + [1 2 3 4 5])

clojure中有很多很棒的工具,通常不需要循环/递归或显式递归之类的东西

但这不会导致堆栈溢出。第一个调用x绑定到1,第二个和后续调用x绑定到1,该调用不是空的。一个选项是apply addall rest x。啊,这更有意义,你知道我将如何使用&在理论上?我该如何以递归的方式分解这些参数?@LinuxN00b好问题-我已经将其编辑到了我的答案中。祝你好运但这不会导致堆栈溢出。第一个调用x绑定到1,第二个和后续调用x绑定到1,该调用不是空的。一个选项是apply addall rest x。啊,这更有意义,你知道我将如何使用&在理论上?我该如何以递归的方式分解这些参数?@LinuxN00b好问题-我已经将其编辑到了我的答案中。祝你好运当我添加&运算符时,您的代码仍然出现堆栈溢出错误。我知道reduce是实现这一点的明智方法,但是我正试图理解如何从头开始正确创建递归函数,以便完全理解它。当我添加&运算符时,您的代码仍然会出现堆栈溢出错误。我知道reduce是实现这一点的明智方法,但是我试图理解如何从头开始正确地创建递归函数,以便完全理解它