试图理解clojure Fibonacci递归

时间:2018-05-13 18:29:38

标签: recursion clojure

我试图理解下面的程序,在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的行为。有人可以帮我理解这是如何工作的吗?

2 个答案:

答案 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文档:

  

“添加”可能发生在不同的“地方”,具体取决于具体类型。

列表的追加发生在列表的开头,向量追加到最后......

https://clojuredocs.org/clojure.core/conj

上查看更多示例