2012-04-22 4 views
0

여기 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

답변

1

명확성을 말하자면 두 가지 기능이 모두 불필요하게 복잡하고 목적에 부적절한 언어 메커니즘을 사용합니다.

생성 피보나치는 다음과 같은 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 대신 1을 요구합니다. – Omu

+0

죄송합니다. 지금 컴퓨터를 사용하지 않고 코드를 작성하는 나쁜 습관을 시도하십시오. ( –

+0

이 방법은 정수로만 작동하며 bigint에서는 작동하지 않습니다 – Omu

관련 문제