http://projecteuler.net/index.php?section=problems&id=15
この問題はcombinationを計算するだけです。
let rec C n m = if m = 0 then 1L else (C n (m - 1)) * (int64 (n - m + 1)) / (int64 m) printfn "%d" (C 40 20)
32ビットで収まらないので必要な部分にLを付けたり型変換しなければなりません。int以外サフィックスを付けるというやり方はあまりいいアイディアではなかったように思えます。
これだけでは面白くないので、各格子点への経路を数える方法で解きましょう。左上を原点として座標をつけて、例えば(3,3)へ辿りつくには(3,2)か(2,3)を通るので、両方の経路数を足します。
let N = 20 let a = array2D [ for i in 0..N -> [ for i in 0..N -> 1L ] ] for x, y in [ for y in 0..N do for x in 0..N -> (x, y) ].Tail do if x = 0 then a.[x,y] <- a.[x,y-1] else if y = 0 then a.[x,y] <- a.[x-1,y] else a.[x,y] <- a.[x,y-1] + a.[x-1,y] printfn "%d" a.[N,N]