2012-04-22 22 views
0

フィボナッチ数を計算する2つの関数は、どちらも正しく動作しますが、別の方法で記述されています。f#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

http://codereview.stackexchange.com/ – tvanfosson

答えて

1

明確に説明すると、両方の機能IMOは不必要に複雑になり、目的には不適切な言語メカニズムを使用します。

生成フィボナッチは以下のように、unfoldを経由して表現するための理想的なフィット感です:

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

あなたはそれをさらに短くし、より明確にする方法は?

UPDATE:質問の作者は、フィボナッチのメンバーが重要なよう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 
+0

はコンパイルされません。(n-1I)、1Iの代わりに1を要求します。 – Omu

+0

申し訳ありません、今、コンピュータを使わずにコードを書く悪い習慣を試してください:(。 –

+0

intでのみ動作し、bigintで動作しません – Omu

関連する問題