【问题标题】:Fibonacci Numbers in HaskellHaskell 中的斐波那契数列
【发布时间】:2011-02-17 17:40:00
【问题描述】:

大家好,我需要将我的 F# 代码更改为 Haskell 代码,但我在 Haskell 中太新了,我不能这样做 我的代码只是从键盘读取数据,如果数据不是整数返回错误消息,然后计算 n 斐波那契数写入列表之后将列表写入txt文件这是我的代码

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

【问题讨论】:

标签: haskell


【解决方案1】:

这基本上是序列本身最常见的实现:

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!"

完成!

【讨论】:

  • 你真的推荐一个复杂度为 O(2^n) 的算法吗?除了较小的 n 值之外,它会非常缓慢。
  • 不推荐!只是说这是最基本的,(最重要的是,因为他是 Haskell 的新手!)最简单的实现。
  • @Yacoby:这是在 F# 中实现的 OP 算法的精确翻译,所以这是翻译,而不是推荐。
  • @LukeN ,使用您的代码,我收到错误“错误:输入时解析错误 `->'”,我是 FP 新手,抱歉。
【解决方案2】:
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)

编辑:要写入文件而不是标准输出,请将 print 替换为 (\num -&gt; appendFile "filename" (show num))(appendFile "filename" . show)

【讨论】:

    猜你喜欢
    • 2017-12-06
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 2021-11-27
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多