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 4clojure#57-简单递归_Recursion_Clojure - Fatal编程技术网

Recursion 4clojure#57-简单递归

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

我正在经历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 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总是附加,但现在我明白了为什么不能。谢谢