2012-04-22 40 views
0

這裏是2個函數計算fibbonaci號,它們都正常工作,但都寫在以不同的方式。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 2012-04-22 13:16:21

回答

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),它要求1,而不是1I – Omu 2012-04-22 13:36:40

+0

對不起,現在就試試,我的壞習慣沒有計算機編寫代碼:(。 – 2012-04-22 13:37:48

+0

這樣,僅適用於整數,不適用於bigint – Omu 2012-04-22 13:39:46