http://projecteuler.net/index.php?section=problems&id=45
この問題はほとんどProject Euler 37と同じです。
Haskellだと簡単に書けます。
polygonal p = [ div (n * ((p - 1) * n + 4 - p)) 2 | n <- [1..] ] coincident (p:ps) (q:qs) | p == q = p:(coincident ps qs) | p < q = coincident ps (q:qs) | p > q = coincident (p:ps) qs main = print (head (tail (tail (coincident (polygonal 5) (polygonal 6)))))
しかし、F#では無限列はリストでは扱えそうにないですし、SequenceではHeadを取り出してTailで再帰的に呼び出すということができないようです。
仕方がないので、次のように3回目に一致した値を取り出す、というようにしてみました。
let Polygonal p n = n * ((p - 2L) * n + 4L - p) / 2L let P = Polygonal 5L let H = Polygonal 6L let rec coincident f m g n counter = let p = f m let q = g n if p = q then if counter = 1 then p else coincident f (m + 1L) g (n + 1L) (counter - 1) else if p < q then coincident f (m + 1L) g n counter else coincident f m g (n + 1L) counter printfn "%d" (coincident P 1L H 1L 3)