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)