저는 F #을 배우고 있는데 왜 충돌이 발생하는지 이해하는 데 어려움을 겪고 있습니다. 그것은 Project Euler problem 2을 풀기위한 시도입니다.F # Seq.initInfinite StackOverflowException을 제공합니다
let rec fibonacci n =
if n = 1 then
1
elif n = 2 then
2
else
fibonacci (n - 1) + fibonacci (n - 2)
let debugfibonacci n =
printfn "CALC: %d" n
fibonacci n
let isEven n =
n % 2 = 0
let isUnderLimit n =
n < 55
let getSequence =
//[1..30]
Seq.initInfinite (fun n -> n)
|> Seq.map debugfibonacci
|> Seq.filter isEven
|> Seq.takeWhile isUnderLimit
Seq.iter (fun x -> printfn "%d" x) getSequence
마지막 버전은 sum 함수를 호출하며 (55보다 큰 제한이 있음) 코드를 학습합니다.
이 경우 StackOverflowException이 발생합니다. 나는 [1..30]에서 언급하고 Seq.initInfinite을 주석 경우, 내가 얻을 :
그것은 내가 LINQ에서 기대하는 것처럼, 필요에 따라 항목을 생성하는 것으로 보인다CALC: 1 CALC: 2 2 CALC: 3 CALC: 4 CALC: 5 8 CALC: 6 CALC: 7 CALC: 8 34 CALC: 9 CALC: 10 CALC: 11
. 그렇다면 initInfinite와 함께 사용하면 왜 폭발합니까?
+1 생성에 StackOverflowException이 발생했습니다. –