Project Euler 15

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]