tôi đang học Haskell, và tôi đã viết một chức năng đơn giản Fibonacci:Haskell Fibonacci có vẻ chậm
fib :: Int -> Int
fib 1 = 1
fib 0 = 0
fib n = (fib (n-1)) + (fib (n-2))
Dường như để biên dịch ok, và tải đoạn mã trên vào REPL GHCI tôi có thể lộn xộn xung quanh với một vài số điện thoại . Tôi đã thử
fib 33
và rất ngạc nhiên khi mất khoảng 4 giây để đưa ra kết quả. (Xin lỗi tôi không biết làm thế nào để thời gian một chức năng trong Haskell được nêu ra, do đó, tính bản thân mình).
Fib 33 không đặc biệt đánh thuế. Câu trả lời là ít hơn 4 triệu. Vì vậy, tôi giả định mã của tôi không phải là rất tốt bằng văn bản hoặc có một số vấn đề với cách tôi đang làm đệ quy có lẽ (tốt, nó không phải là tốt bằng văn bản ở chỗ nó không đưa vào tài khoản số nguyên âm). Câu hỏi đặt ra là, tại sao nó lại chậm? Bất kỳ trợ giúp nào được đánh giá cao.
Câu hỏi này có vẻ là một trong những tốt cho CodeReview. – Alexander
Khi xem mã của bạn, hãy tưởng tượng mức độ thường xuyên ví dụ 'fib (5)' được tính toán. Mỗi lần lặp lại, bạn tính toán lại tất cả các số lượng "bên trong". – WeSt
Bạn nên sử dụng phiên bản danh sách vô hạn lười biếng cổ điển: 'fibs = 0: 1: zipWith (+) fibs (tail fibs)' với 'fib n = fibs !! n'. Xem [wiki haskell về chuỗi Fibonacci] (https://www.haskell.org/haskellwiki/The_Fibonacci_sequence).Thật thú vị rằng Fibonacci nổi tiếng với chuỗi này, đó chỉ là một bài tập nhỏ trong cuốn sách mà anh ta nên nổi tiếng, đã giới thiệu giá trị địa điểm cho Tây Âu. – AndrewC