gpt4 book ai didi

F#Seq.initInfinite给出StackOverflowException

转载 作者:行者123 更新时间:2023-12-04 09:38:03 25 4
gpt4 key购买 nike

我正在学习F#,但无法理解为什么会崩溃。这是尝试解决Project Euler problem 2的尝试。

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中添加注释,则会得到:

计算:1
计算:2
2个
计算:3
计算:4
计算:5
8
计算:6
计算:7
计算:8
34
计算值:9
计算值:10
计算值:11

正如我在LINQ中所期望的那样,它似乎是按需生成项目的。那么为什么在与initInfinite一起使用时会爆炸呢?

最佳答案

Seq.initInfinite返回以0开头的序列。

您的fibonacci函数用零调用时会导致堆栈溢出,因为它永远不会遇到终止情况。

您可以通过从Seq.initInfinite (fun n -> n + 1)开始解决此问题

关于F#Seq.initInfinite给出StackOverflowException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2807644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com