2010-05-10 87 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