在f#中有多个赋值(即a,b = b,a),可以在一行中写出Fibonacci ..有人可以说明它是怎样的......我知道它可能在ruby中
答案 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")