在F#中创建一个列表或数字序列,直到某个值

时间:2015-01-16 02:31:03

标签: algorithm function math f# functional-programming

假设我想创建一个5555以下的所有立方数的列表或序列,或4500以下的斐波那契数 - 我该怎么做?

我可以生成这些列表或序列,但我不知道如何让它们在某一点之后终止。

在fibonacci序列的情况下,很难计算n使得F(n)小于某个x,所以我需要一个生成列表或序列元素的解决方案,直到其中一个元素超过上层界。

1 个答案:

答案 0 :(得分:4)

在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 }

第一个函数递归地生成所有整数的序列(如果这是使用无界数字类型,这将是“无限”)。第二个应用转换。

正如评论Seq.takeWhile中所述,您可以限制系列。假设你想要所有小于1000的正方形:

squares |> Seq.takeWhile (fun n -> n < 1000)

然后您可以使用例如完整评估系列List.ofSeq