0

这是计算斐波那契数的 2 个函数,它们都可以正常工作,但以不同的方式编写。

您认为哪一个更好、更高效、代码更易于理解?

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
4

1 回答 1

1

说到清晰度,您的两个功能 IMO 都没有必要杂乱无章,并且为此目的使用了不充分的语言机制。

生成斐波那契非常适合通过 表示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
于 2012-04-22T13:19:37.833 回答