Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# F中的Fibonnaci_F# - Fatal编程技术网

F# F中的Fibonnaci

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中,变量通

对于多重赋值,即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中,变量通常是不可变的,所以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]