F# F中的Fibonnaci
对于多重赋值,即a,b=b,a在f中,可以在一行中写入斐波那契。。有人能告诉我这是怎么回事吗。。我知道这在ruby中是可能的,Scott Hanselman在F# F中的Fibonnaci,f#,F#,对于多重赋值,即a,b=b,a在f中,可以在一行中写入斐波那契。。有人能告诉我这是怎么回事吗。。我知道这在ruby中是可能的,Scott Hanselman在 let main = System.Console.WriteLine("Fibonacci") 以下是相关片段: let rec fib n = if n < 2 then 1 else fib (n-2) + fib(n-1) Scott是从我发布Scott的版本中得到的,因为他也有Ruby代码。值得注意的是,在F中,变量通
let main = System.Console.WriteLine("Fibonacci")
以下是相关片段:
let rec fib n = if n < 2 then 1 else fib (n-2) + fib(n-1)
Scott是从我发布Scott的版本中得到的,因为他也有Ruby代码。值得注意的是,在F中,变量通常是不可变的,所以a,b=b,a实际上并没有重新分配任何东西,我认为这甚至是无效的语法。相反,像let swap a,b=b,a这样的函数获取一个元组并返回一个新的元组,其内容是相反的 通过辅助函数fibi中的尾部递归实现更长但更快的版本:
对于未初始化的用户,Seq.unfold是一个序列生成器。它接受作为种子的输入,并调用一个函数,该函数返回序列中的下一个元素SomenextElement、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]
我认为他/她指的是斐波那契函数的定义^ ^;好吧,它仍然用一行字写下斐波那契:你真的在开玩笑吗?提问者真的问了一个明确的问题。很明显,在这个问题上没有幽默的地方。>@eriawan:让我们说我更喜欢简单的解决方案。清晰的问题,清晰的答案。从问题的措辞来看,这可能在代码高尔夫中更为恰当:正如Hanselman博客上的评论所指出的,对于n=0也是不正确的。
> 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]