f#fibbonaci高效算法

时间:2012-04-22 13:11:48

标签: f# fibonacci

这里有两个计算fibbonaci数的函数,它们都能正常工作,但是以不同的方式编写。

您认为哪一个更好,效率更高,代码更容易理解?

let fibe n =
    let rec loop acc1 acc2 n = 
        match n with
        | n when n = 0I -> acc1        
        | x -> loop acc2 (acc1 + acc2) (x - 1I)
    loop 0I 1I n

let myfib n =
    if n = 0I then 0I
    else if n = 1I then 1I
    else
    let rec loop i f s = 
        match i with 
        | x when x = n -> f+s 
        | x when x < n -> loop (i+1I) s (s+f)        
    loop 2I 0I 1I

1 个答案:

答案 0 :(得分:1)

谈到清晰度,你的职能IMO都是不必要的混乱,并且为此目的使用了不充分的语言机制。

生成Fibonacci非常适合通过unfold表达,如下所示:

let fibnum n =
    let fibnums = Seq.unfold (fun (current, next) -> 
                Some(current, (next, current+next)))(0I,1I)
    fibnums |> Seq.nth n

你怎么能让它更短更清晰?

更新:由于问题的作者认为能够使用序号为bigint的斐波那契成员进行操作非常重要,因此上述代码段肯定可以用于此要求,尽管简单的:

let fibnum bigN = 
    let fibnumsI =
        ((0I,0I),(1I,0I))
        |> Seq.unfold (fun ((current, idx), (next, idx)) ->  
            Some((current, idx),((next, idx + 1I), (current+next, idx + 1I))))
    fibnumsI |> Seq.skipWhile (fun (x,i) -> i < bigN) |> Seq.head |> fst