Tôi đang cố gắng để hiểu việc thực hiện các đoạn mã sau:Hiểu được thực hiện một thi fibonacci lười biếng trong Clojure
(def fibs
(concat (lazy-seq [0 1]) (lazy-seq (map + fibs (rest fibs)))))
Đây là những gì tôi mong chờ việc thực hiện để trông giống như
[0 1 : (map + [0 1] [1]) => 1
[0 1 1 : (map + [0 1 1] [1 1]) => 1 2
[0 1 1 1 2 : (map + [0 1 1 2] [1 1 2]) => 1 2 3
[0 1 1 1 2 1 2 3 : (map + [0 1 1 2 3] [1 1 2 3]) => 1 2 3 5
[0 1 1 1 2 1 2 3 1 2 3 5 ....
Rõ ràng là không chính xác, vì kết quả là sai. Việc thực hiện duy nhất tôi có thể đưa ra rằng sản xuất kết quả chính xác là:
[0 1 : (map + [0 1] [1]) => 1
[0 1 1 : (map + [1 1] [1]) => 2
[0 1 1 2 : (map + [1 2] [2]) => 3
[0 1 1 2 3 : (map + [2 3] [3]) => 5
[0 1 1 2 3 5 ....
Đây có phải là "đại diện" chính xác của tình trạng đầu và đuôi trong khi thực hiện? Nếu vậy, tại sao (rest fibs)
trả về một mục duy nhất? Có phải vì một cuộc gọi đệ quy như (nghỉ ngơi (nghỉ ngơi (nghỉ ngơi [1 1 2 3])))?