Các in số thứ n của Fibonacci loạt.
Chương trình này không in được gì. Nếu bạn đang nhìn thấy đầu ra, có thể là do bạn đang gọi nó từ read-eval- in-vòng lặp (REPL), đọc biểu mẫu, đánh giá nó, và sau đó in kết quả. Ví dụ, bạn có thể thực hiện:
CL-USER> (fibonacci 4)
2
Nếu bạn quấn rằng cuộc gọi trong cái gì khác, tuy nhiên, bạn sẽ thấy bất cứ điều gì mà nó không in:
CL-USER> (progn (fibonacci 4) nil)
NIL
Như bạn đã có này bằng văn bản, nó sẽ khó khăn để sửa đổi nó để in mỗi mã số chỉ một lần, kể từ khi bạn làm rất nhiều tính toán dư thừa. Ví dụ, các cuộc gọi đến
(fibonacci (- n 1))
sẽ tính (fibonacci (- n 1))
, nhưng như vậy sẽ gọi trực tiếp đến
(fibonacci (- n 2))
Điều đó có nghĩa bạn có thể không muốn mỗi cuộc gọi đến fibonacci
phép in toàn bộ chuỗi. Nếu bạn làm thế, tuy nhiên, lưu ý rằng (print x)
trả về giá trị của x
, vì vậy bạn chỉ có thể làm:
(defun fibonacci(n)
(cond
((eq n 1) 0)
((eq n 2) 1)
((print (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))))
CL-USER> (progn (fibonacci 6) nil)
1
2
1
3
1
2
5
NIL
Bạn sẽ thấy một số phần lặp đi lặp lại ở đó, kể từ khi có tính toán dự phòng.Bạn có thể tính toán series nhiều hiệu quả hơn, tuy nhiên, bằng cách bắt đầu từ hai chữ số đầu tiên, và đếm lên:
(defun fibonacci (n)
(do ((a 1 b)
(b 1 (print (+ a b)))
(n n (1- n)))
((zerop n) b)))
CL-USER> (fibonacci 6)
2
3
5
8
13
21
Thực ra, tôi không được phép sử dụng chức năng đảo ngược. Tôi đã làm điều đó trong một hàm đệ quy duy nhất, mà không sử dụng bất kỳ chức năng sẵn có nào như ngược lại. Dù sao cũng cảm ơn bạn. – wackyTechie
@wackyTechie Bạn nên đề cập đến các hạn chế trong câu hỏi của mình. Tôi đã thêm làm thế nào để làm điều đó mà không có một bộ tích lũy. – Sylwester
Vâng, đã nhận ra sau. Cảm ơn rất nhiều! – wackyTechie