Recursion 使用递归创建clojure add函数
我正试图用clojure来处理递归。下面的代码出现堆栈溢出错误,有人能发现问题吗 我知道这是低效的,但严格来说是为了学习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
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是实现这一点的明智方法,但是我试图理解如何从头开始正确地创建递归函数,以便完全理解它