Recursion 4clojure#57-简单递归
我正在经历4个法律问题,我不知道为什么 我知道Recursion 4clojure#57-简单递归,recursion,clojure,Recursion,Clojure,我正在经历4个法律问题,我不知道为什么 我知道(foo(dec x))必须被视为一个持久的集合,才能让它发挥作用,但到底发生了什么是一个谜。任何关于它为什么起作用以及为什么按此顺序工作的见解都将受到赞赏 我们来分析一下: (foo 5) ;;=> (conj (foo 4) 5) ;;=> (conj (conj (foo 3) 4) 5) ;;=> ... (conj (conj (conj (conj (conj nil 1) 2) 3) 4) 5) ;; (conj ni
(foo(dec x))
必须被视为一个持久的集合,才能让它发挥作用,但到底发生了什么是一个谜。任何关于它为什么起作用以及为什么按此顺序工作的见解都将受到赞赏 我们来分析一下:
(foo 5) ;;=>
(conj (foo 4) 5) ;;=>
(conj (conj (foo 3) 4) 5) ;;=>
...
(conj (conj (conj (conj (conj nil 1) 2) 3) 4) 5)
;; (conj nil 1) == '(1), so:
;;=>
(conj (conj (conj (conj '(1) 2) 3) 4) 5)
;; conj-ing adds to the head of the list
;;=>
(conj (conj (conj '(2 1) 3) 4) 5)
;;=>
(conj (conj '(3 2 1) 4) 5)
...
;;=> '(5 4 3 2 1)
让我们来分析一下:
(foo 5) ;;=>
(conj (foo 4) 5) ;;=>
(conj (conj (foo 3) 4) 5) ;;=>
...
(conj (conj (conj (conj (conj nil 1) 2) 3) 4) 5)
;; (conj nil 1) == '(1), so:
;;=>
(conj (conj (conj (conj '(1) 2) 3) 4) 5)
;; conj-ing adds to the head of the list
;;=>
(conj (conj (conj '(2 1) 3) 4) 5)
;;=>
(conj (conj '(3 2 1) 4) 5)
...
;;=> '(5 4 3 2 1)
让我们仔细看看您的代码示例。基本上,它只是一个函数调用
(foo 5)
,具有以下foo
函数:
(defn foo[x]
(当(>x0)
(conj(foo(dec x))x)
当您使用任何非正值x
调用foo
时,它将返回nil
。否则,它返回一个连接x
到调用的结果(foo(dec x))
因此,调用(foo 2)
大致相当于以下代码:
(conj(conj nil 1)2)
可能会让您感到困惑的是conj
行为及其作为第一个参数传递的nil
值
conj
威胁nil
作为空列表()
,因此(conj nil 1)
产生与(conj()1)
相同的结果。此行为记录在conj
文档中:
=> (doc conj)
(doc conj)
-------------------------
clojure.core/conj
([coll x] [coll x & xs])
conj[oin]. Returns a new collection with the xs
'added'. (conj nil item) returns (item). The 'addition' may
happen at different 'places' depending on the concrete type.
另一件可能让您困惑的事情是结果列表中元素的顺序conj
旨在以最有效的方式向PersistentCollection
添加新元素。如果列表conj
将新元素添加到原始列表的开头:
=> (conj '(1) 2)
(2 1)
让我们仔细看看您的代码示例。基本上,它只是一个函数调用(foo 5)
,具有以下foo
函数:
(defn foo[x]
(当(>x0)
(conj(foo(dec x))x)
当您使用任何非正值x
调用foo
时,它将返回nil
。否则,它返回一个连接x
到调用的结果(foo(dec x))
因此,调用(foo 2)
大致相当于以下代码:
(conj(conj nil 1)2)
可能会让您感到困惑的是conj
行为及其作为第一个参数传递的nil
值
conj
威胁nil
作为空列表()
,因此(conj nil 1)
产生与(conj()1)
相同的结果。此行为记录在conj
文档中:
=> (doc conj)
(doc conj)
-------------------------
clojure.core/conj
([coll x] [coll x & xs])
conj[oin]. Returns a new collection with the xs
'added'. (conj nil item) returns (item). The 'addition' may
happen at different 'places' depending on the concrete type.
另一件可能让您困惑的事情是结果列表中元素的顺序conj
旨在以最有效的方式向PersistentCollection
添加新元素。如果列表conj
将新元素添加到原始列表的开头:
=> (conj '(1) 2)
(2 1)
真正帮助我理解conj的是当你解释订单时。从我的理解来看,conj总是附加,但现在我明白了为什么不能。谢谢你在解释订单时真正帮助我理解了conj。从我的理解来看,conj总是附加,但现在我明白了为什么不能。谢谢