2011-04-04 35 views
0

在f#中有多重賦值(即a​​,b = b,a),它可以在單行中寫Fibonacci ..可以有人展示它是如何的..我知道它可能在ruby中F中的Fibonnaci#

+1

從問題是如何措辭,這可能是在代碼高爾夫更approprite:http://codegolf.stackexchange.com – 2011-04-04 04:31:05

回答

3

斯科特Hanselman的幾乎涵蓋這this blog post.

下面是相關片段:

let rec fib n = if n < 2 then 1 else fib (n-2) + fib(n-1) 

斯科特得到了來自Dustin Cambell's blog.我張貼斯科特的版本,因爲他也有它的Ruby代碼。值得注意的是,在F#中,變量通常是不可變的,所以a,b = b,a實際上並沒有重新分配任何東西(我認爲它甚至不是有效的語法)。相反,像let swap (a,b) = (b,a)這樣的函數正在獲取一個元組,並返回一個新的元組,其內容反轉。

+0

正如Hanselman的博客評論中指出的那樣,n = 0也不正確。 – 2011-04-04 05:47:49

-1
let main = System.Console.WriteLine("Fibonacci") 
+0

我想他/她是指斐波那契函數的定義^^; – 2011-04-04 04:30:35

+1

那麼,它仍然寫斐波那契在一行:) – CloudyMarble 2011-04-04 07:35:33

+1

你真的在開玩笑嗎?提問者確實提出了明確的問題。 – 2011-04-04 07:49:52

4

更長但更快版本(經由尾遞歸在輔助功能fibi):

let fib = let rec fibi a b = function | 0 -> a | c -> fibi b (a+b) (c-1) in fibi 0I 1I 
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]