我试图理解下面的程序,在Clojure中使用递归来找到Fibonacci系列。
(defn fib
[x]
(loop [i '(1 0)]
(println i)
(if (= x (count i))
(reverse i)
(recur
(conj i (apply + (take 2 i))))))) // This line is not clear
对于来电fib(4)
,我得到以下输出
(1 0)
(1 1 0)
(2 1 1 0)
(0 1 1 2)
根据我的推断,conj
似乎将(apply + (take 2 i))
的值添加到i
的开头。但这不是conj
的行为。有人可以帮我理解这是如何工作的吗?
答案 0 :(得分:2)
对于列出, 是root@proxima:~# docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 18.05.0-ce
Storage Driver: btrfs
Build Version: Btrfs v4.15.1
Library Version: 102
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 773c489c9c1b21a6d78b5c538cd395416ec50f88
runc version: 4fc53a81fb7c994640722ac585fa9ca548971871
init version: 949e6fa
Security Options:
apparmor
seccomp
Profile: default
Kernel Version: 4.15.0-20-generic
Operating System: Ubuntu 18.04 LTS
OSType: linux
Architecture: x86_64
CPUs: 8
Total Memory: 31.33GiB
Name: proxima
ID: HFCK:DE5O:VDGY:PK3Z:WXNP:OF4P:CGIV:Z3XE:TM7F:VIMG:7ZUH:CXNW
Docker Root Dir: /ozone/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
WARNING: No swap limit support
的行为。 # <file system> <mount point> <type> <options> <dump> <pass>
/dev/md2 / ext4 errors=remount-ro,discard 0 1
/dev/md1 /boot ext4 errors=remount-ro,discard 0 1
/dev/sda3 swap swap defaults 0 0
/dev/sdb3 swap swap defaults 0 0
/dev/sda4 /ozone btrfs defaults,noatime,ssd,compress=zstd,commit=120 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
并不总是添加到最后:
conj
添加元素的位置取决于集合的类型。由于添加到列表末尾的费用很高,因此conj
会添加到前面。它是相同的操作(添加到列表中),但针对正在使用的集合进行了优化。
答案 1 :(得分:1)
Per Clojure文档:
“添加”可能发生在不同的“地方”,具体取决于具体类型。
列表的追加发生在列表的开头,向量追加到最后......
上查看更多示例