2013-05-26 37 views
13

Tôi đã xem kết quả của việc thực hiện chuỗi Fibobacci của tôi trong Haskell khi tôi nhận ra một số biểu mẫu "lạ" trong kết quả của các con số.Fibonacci Seq. hình thức đầu ra lạ (Haskell)

Trước hết, đây là mã Haskell tôi đã đi lên với:

fib :: Integer -> [Integer] 
fib 0 = [0] 
fib 1 = [0, 1] 
fib a = (fib' 0 1 [0,1] 1 a) 

fib' :: Integer -> Integer -> [Integer] -> Integer -> Integer -> [Integer] 
fib' n1 n2 l cont n 
     | cont == n = l 
     | otherwise = (fib' n2 n3 (l++[n3]) (cont+1) n) 
      where n3 = n2 + n1 

Đối với một cái gì đó giống như fib 10 đầu ra sẽ là: [0,1,1,2,3,5, 8,13,21,34,55] Sau đó, tôi muốn thử một cái gì đó như fib 1000, trong khi những con số là vô cùng lớn và tất cả ... những gì tôi thấy là một số elipses kỳ lạ được hình thành bởi "," được in ra giữa mỗi Integer từ danh sách, ví dụ:

example1

vì vậy, tôi đã maxed kích thước của cửa sổ đầu ra để xem nếu mô hình kỳ lạ này vẫn sẽ lặp lại, và câu trả lời là có:

example2

Và câu hỏi của tôi là:

Có ai biết tại sao xuất hiện mô hình này trong " ", giữa các số nguyên từ danh sách? Không nên ngẫu nhiên hơn và ít giống như elips hơn?

+3

Xem thêm [bài đăng reddit này] (http://www.reddit.com/r/haskell/comments/xwfbm/iterate_2_1/). –

+1

Điều này thật tuyệt vời trên [CodeGolf] (http://codegolf.stackexchange.com/) – crockeea

Trả lời

21

Số Fibonacci grow as an exponential function của n.

Độ dài của một số thập phân về bản chất là cơ sở lôgarít của nó 10. Do đó, độ dài của Fibonacci tăng lên như hàm tuyến tính n, vì lôgarit và số mũ hủy nhau.

Vì vậy, nếu bạn in chúng trong một cột, bạn sẽ thấy một đường thẳng. Nhưng bạn in chúng từng cái một, vì vậy các vị trí tích lũy. Nếu bạn đang lấy số tiền tích lũy của một chuỗi tuyến tính, bạn sẽ nhận được một chuỗi bậc hai.

Tại địa phương, mỗi dòng chứa khoảng cùng số số Fibonacci, hãy gọi nó là k. Điều này có nghĩa là hai điều:

  1. Số dòng thay đổi tuyến tính với n.
  2. Để tính toán vị trí thực của dấu phẩy (so với cạnh trái của cửa sổ), chúng ta cần phải lấy phần còn lại của "vị trí tuyệt đối" tích lũy theo chiều dài dòng. Tương đương (trung bình) để trừ 1/k cho mỗi số gia tăng là n. Điều chỉnh này là tuyến tính và không thay đổi hành vi bậc hai của vị trí.

Vì vậy, những gì bạn thấy là hình parabol - biểu đồ của hàm bậc hai.

+0

Làm cho rất nhiều ý nghĩa, thanx! –

3

Chẳng có gì lạ khi bạn nghĩ về nó. Các số Fibonacci lân cận có độ dài tương tự và độ dài tăng theo trình tự. Vì vậy, giả sử bạn có một kích thước màn hình 30 ký tự, và F(n) có 29 chữ số, sau đó cho một vài con số tiếp theo, độ dài có thể là hiện tại của bạn:

29, 29, 29, 30, 30, 30, 31, 31, 31 

nào mang lại cho bạn trái -> ổn định -> phong trào đúng .

Các vấn đề liên quan