2010-05-10 85 views
3

嗨,我需要將我的F#代碼更改爲Haskell代碼,但我是如此新的Haskell,我不能這樣我的代碼只是從鍵盤讀取數據,如果數據不是整數返回錯誤消息,然後計算ñ斐波那契數,然後寫入到一個列表寫入列表後成txt文件這裏是我的代碼斐波那契數字在Haskell

open System 
let rec fib n = 
    match n with 
    |0->0 
    |1->1 
    |2->1 
    |n->fib(n-1)+fib(n-2);; 

let printFibonacci list = 
    for i=0 to (List.length list)-1 do 
     printf "%d " (list.Item(i));; 

let writeToFile list = 
    let file = System.IO.File.Create("C:\out2.txt") 
    let mutable s ="" 
    let writer = new System.IO.StreamWriter(file) 
    try 
     for i=0 to (List.length list)-1 do 
     s <- list.Item(i).ToString() 
     writer.Write(s+" ") 

    finally 
     writer.Close() 
     file.Dispose() 
     printfn "Writed To File" 


let mutable control = true 
let mutable num = 0 
while control do 
    try 
    printfn "Enter a Number:" 

    num <- Convert.ToInt32(stdin.ReadLine()) 
    let listFibonacci = [for i in 0 .. num-1->fib(i)] 
    printFibonacci(listFibonacci) 
    printfn "\n%A"(listFibonacci) 
    writeToFile(listFibonacci) 
    control<-false 
    with 
     | :? System.FormatException->printfn "Number Format Exception"; 

Console.ReadKey true|>ignore 
+1

這裏覆蓋得很好:http://stackoverflow.com/questions/1105765/generating-fibonacci-numbers-in-haskell – JeffH 2010-05-10 15:33:17

+1

谷歌會給你Haskell wiki頁面:http://www.haskell.org/haskellwiki/The_Fibonacci_sequence詳細說明了這一點。 – 2010-05-10 18:10:25

回答

2

這基本上是序列本身的最常見的實現:

fib 0 = 0 
fib 1 = 1 
fib n = fib (n-1) + fib (n-2) 

如果你想鍵盤上的數字:

main :: IO() 
main = catch doFib handle 
    where doFib = do 
      num <- readLn 
      putStrLn $ "Fib of " ++ show num ++ " = " ++ (show . fib $ num) 
     handle _ -> putStrLn "Malformed input!" 

完成!

+0

你真的推薦一個複雜度爲O(2^n)的算法嗎?除了n的小數值之外,其他任何事情都會變得非常緩慢。 – Yacoby 2010-05-10 15:39:43

+3

不推薦!只是說它是最基本的,並且(這裏最重要的是,他是haskell的新手!)最簡單的實現。 – LukeN 2010-05-10 15:41:55

+4

@Yacoby:這是F#中實現的OP算法的精確翻譯,所以它是翻譯,而不是推薦。 – yairchu 2010-05-10 20:53:28

15
fib 0 = 0 
fib 1 = 1 
fib n = fib (n-1) + fib (n-2) 

main = do putStrLn "Enter a number:" 
      num <- readLn 
      fibs = map fib [0..n] 
      mapM' print fibs 

但是由於haskell是懶惰的,所以有一個巧妙的方法來定義所有斐波那契數列表。而且,由於你想要的清單的前綴,它更自然地用這個定義(也更有效):

fibs = 0 : 1 : zipWith (+) fibs (tail fibs) 

main = do putStrLn "Enter a number:" 
      num <- readLn 
      mapM' print (take n fibs) 

編輯:要寫入文件,而不是標準輸出與(\num -> appendFile "filename" (show num))(appendFile "filename" . show)更換print

+0

非常感謝你的身體 – boraer 2010-05-11 07:34:11