2013-12-12 4 views
1

나는 작동하지만 이상하지 않은이 clunky 함수를 작성했습니다. F #에서 계승을 계산하기 위해 메모와 함께 재귀 함수를 작성하는 좋은 방법은 무엇입니까? 이 함수는 사전 형식 데이터 구조를 결과와 함께 반환하거나이 함수와 같은 변수에 저장할 수 있습니다.F를 사용하여 재귀 적으로 Memoization과 함께 Factorials 찾기 #

open System.Collections.Generic 

let factorials = Dictionary<int, int>() 
factorials.Add(1, 1) 

let rec factorial n = 
    if n <= 1 then 1 
    else 
     match factorials.TryGetValue(n) with 
     | true, _ -> n * factorial(n-1) 
     | false, _ -> 
      factorials.Add(n, n * factorial(n-1)) 
      n * factorial(n-1)  

let a = factorial 9 
+0

이 질문에 codereview.stackexchange.com에 더 적합 –

+0

에 대해 생각하는 것은 - n이 계승의 관점에서 당신은 매우 높은하지 않는 32 비트 정수를 사용하여. 가장 좋은 해결책은'let res = [1; 1; 2; 6; ...]; fac n = res. [n]'이라고하자. 더 정밀도를 위해 bigintegers를 사용하는 것에 대해 생각해야합니다. –

+0

@ildjarn, John Palmer는 이미 이것을 지적했습니다. 실제로 코드를 사용하는 것보다는 학습 연습으로 더 많이하고 있습니다. 내가 문제를 해결하기 위해 노력하고있어 프로젝트 Euler 문제를 F #을 사용하여, 그 문제에서, 나는 단지 1에서 9까지의 계승이 필요합니다. – reggaeguitar

답변

1
open System.Collections.Generic 

let factorials = Dictionary<int, int>() 
factorials.Add(1,1) 

let factorial n = 
    let dictValue : int ref = ref 0 
    let rec factorialWithAcc n limit acc = 
     match n with 
     | x when n > limit ->() 
     | _ -> 
      let acc = acc * n 
      if factorials.TryGetValue(n,dictValue) 
      then() 
      else factorials.Add(n,acc) 
      factorialWithAcc (n+1) limit acc 
    factorialWithAcc 1 n 1 

let printFact() = 
    let rec printFact n = 
     match n with 
     | 0 ->() 
     | _ -> 
      printfn "n: %A, %A" n factorials.[n] 
      printFact (n-1) 
    printFact factorials.Count 

let test() = 
    let result = factorial 9 
    printFact() 

test()