Я немного застрял на последнем этапе получения решения problem 2 на Project Euler. Это источник, который я получил до сих пор.Project Euler Problem 2 in F #
#light
module pe2 (* Project Euler Problem 2 solution *)
open System
let Phi = 1.6180339887;;
let invPhi = 1.0/Phi;;
let rootOfFive = 2.236067977;;
let maxFib = 4000000.0;
let Fib n =
System.Math.Round((Phi**n - invPhi**n)/rootOfFive);;
let FibIndices = Seq.unfold(fun i -> Some(i, i+3.0)) 3.0;;
let FibNos = FibIndices |> Seq.map(fun index -> Fib(index));;
let setAllowedFibNos = FibNos |> Seq.filter(fun fn -> (fn <= maxFib));;
// let answer = setAllowedFibNos |> Seq.fold (+) 0.0;
Когда я раскомментирую последнюю строку, процесс никогда не заканчивается. Поэтому я надеялся, что кто-то может слегка подтолкнуть меня в правильном направлении. Я смотрел на setAllowedFibNos, и это выглядит правильно, но это также бесконечная последовательность, поэтому я вижу только первые три условия.
Кроме того, может ли кто-нибудь указать мне на правильный путь, чтобы связать различные последовательности вместе? Я пробовал что-то вроде этого:
let answer = Seq.unfold(fun i-> Some(i, i + 3.0)) 3.0
|> Seq.map (fun index -> Fib(index))
|> Seq.filter(fun fn -> (fn <= maxFib))
|> Seq.fold (+) 0.0;;
Но это не сработало. Поскольку вы, вероятно, можете догадаться, что я просто изучаю F #, поэтому, пожалуйста, ласково, и если этот вопрос задан и ответили ранее, пожалуйста, напишите ссылку на ответ, и я заберу это.
Кроме того, вы можете использовать вместо Seq.sum складки и ваша анонимная функция вокруг Fib является избыточным (Seq.map Фибо достаточно). – dahlbyk
Спасибо Брайан. Мне было любопытно об одном - разве Seq.filter не делает последовательность бесконечной? –
Нет; Я могу фильтровать только выравнивания от 1,2,3,4, ... и результат по-прежнему бесконечен 2,4, ... – Brian