在 F# 中创建不超过某个值的列表或数字序列
Creating a list or sequence of numbers up to a certain value in F#
假设我想创建一个包含 5555 以下的所有立方数或 4500 以下的斐波那契数的列表或序列 - 我该怎么做?
我可以生成这些的列表或序列,但我不知道如何让它们在某个点后终止。
在斐波那契数列的情况下,很难计算 n 使得 F(n) 小于某个 x,因此我需要一个解决方案来生成列表或序列的元素,直到其中一个元素超过上限。
在 F# 中,您可以使用 seq<'T>
类型处理延迟生成的序列。例如,要生成所有整数的平方,您可以这样写:
let rec integersFrom n = seq {
yield n
yield! integersFrom (n + 1) }
let squares = seq {
for n in integersFrom 0 do
yield n * n }
第一个函数递归地生成所有整数的序列(如果使用无界数字类型,则为 "infinite")。第二个应用转换。
如评论中所述,Seq.takeWhile
允许您限制系列。假设您想要所有小于 1000 的方块:
squares |> Seq.takeWhile (fun n -> n < 1000)
然后您可以使用例如List.ofSeq
.
假设我想创建一个包含 5555 以下的所有立方数或 4500 以下的斐波那契数的列表或序列 - 我该怎么做?
我可以生成这些的列表或序列,但我不知道如何让它们在某个点后终止。
在斐波那契数列的情况下,很难计算 n 使得 F(n) 小于某个 x,因此我需要一个解决方案来生成列表或序列的元素,直到其中一个元素超过上限。
在 F# 中,您可以使用 seq<'T>
类型处理延迟生成的序列。例如,要生成所有整数的平方,您可以这样写:
let rec integersFrom n = seq {
yield n
yield! integersFrom (n + 1) }
let squares = seq {
for n in integersFrom 0 do
yield n * n }
第一个函数递归地生成所有整数的序列(如果使用无界数字类型,则为 "infinite")。第二个应用转换。
如评论中所述,Seq.takeWhile
允许您限制系列。假设您想要所有小于 1000 的方块:
squares |> Seq.takeWhile (fun n -> n < 1000)
然后您可以使用例如List.ofSeq
.