F#中的斐波那契

时间:2011-04-04 04:24:29

标签: f#

在f#中有多个赋值(即a​​,b = b,a),可以在一行中写出Fibonacci ..有人可以说明它是怎样的......我知道它可能在ruby中

4 个答案:

答案 0 :(得分:4)

更长但更快的版本(通过辅助函数fibi中的尾递归):

let fib = let rec fibi a b = function | 0 -> a | c -> fibi b (a+b) (c-1) in fibi 0I 1I

答案 1 :(得分:3)

Scott Hanselman在this blog post.

中涵盖了这一点

以下是相关摘录:

let rec fib n = if n < 2 then 1 else fib (n-2) + fib(n-1)
斯科特从Dustin Cambell's blog.得到了这个,我发布了Scott的版本,因为他也有Ruby代码。值得注意的是,在F#中,变量通常是不可变的,因此a,b = b,a实际上并没有重新分配任何东西(我认为它甚至不是有效的语法)。相反,像let swap (a,b) = (b,a)这样的函数正在取一个元组并返回一个新的元组,内容被反转。

答案 2 :(得分:3)

对于没有经验的人来说,Seq.unfold是一个序列生成器。它接受作为种子作为输入并调用一个函数,该函数返回序列中的下一个元素Some(nextElement, nextSeed)None以终止序列。

这是一个非常有趣的斐波那契单线:

> let fibs = (0L, 1L) |> Seq.unfold (fun (a, b) -> Some(a, (b, a+b)));;

val fibs : seq<int64>

> fibs |> Seq.take 50 |> Seq.toList;;
val it : int64 list =
  [0L; 1L; 1L; 2L; 3L; 5L; 8L; 13L; 21L; 34L; 55L; 89L; 144L; 233L; 377L; 610L;
   987L; 1597L; 2584L; 4181L; 6765L; 10946L; 17711L; 28657L; 46368L; 75025L;
   121393L; 196418L; 317811L; 514229L; 832040L; 1346269L; 2178309L; 3524578L;
   5702887L; 9227465L; 14930352L; 24157817L; 39088169L; 63245986L; 102334155L;
   165580141L; 267914296L; 433494437L; 701408733L; 1134903170L; 1836311903L;
   2971215073L; 4807526976L; 7778742049L]

答案 3 :(得分:-1)

let main = System.Console.WriteLine("Fibonacci")