The key to this one, unlike the traditional non-tail-recursive definition of the Fibonacci sequence, is to generate the next element in the sequence given the previous two.
let problem25a = let rec find n1 n2 term = let n0 = n1 + n2 if (n0 |> string).Length = 1000 then term else find n0 n1 (term+1) find 1I 1I 3
Playing around with recursive sequences, I came up with this neat solution which runs on average the same as solution (a).
let problem25b = let fibseq = let rec fibseq n1 n2 = seq { let n0 = n1 + n2 yield n0 yield! fibseq n0 n1 } seq {yield 1I ; yield 1I ; yield! (fibseq 1I 1I)} (fibseq |> Seq.findIndex (fun i -> (i |> string).Length = 1000)) + 1
No comments:
Post a Comment