这里有两个计算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
答案 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