2015-09-14 24 views
2

這是階乘函數的F#凡定義的參數

let rec fact =function 
    | 0->1 
    | n-> n * fact(n-1);; 



    fact 5 

1 - 什麼是這裏的rec字的作用一個簡單的執行力度?

2-事實是函數,但從未提及它可以有一個參數。 從技術上講,它應該面臨一個錯誤,因爲在簽名 (let rec fact)中沒有爲其定義參數。 那麼它是如何工作的?

+1

只是作爲一個警告:雖然這是*遞歸101 *這是事實,最壞的可能實現(很慢的一個,將打擊堆棧,...) - 這裏是一個更好的:'let fact n = List.fold(*)1 [1..n]' – Carsten

回答

6

1)rec用於標記函數遞歸。沒有它,你將無法從函數實現中調用它。瞭解更多關於MSDN:Recursive Functions: The rec Keyword (F#)

2)let rec fact = function爲快捷方式:

let rec fact argument = 
    match argument with 
    | 0 -> 1 
    | n -> n * fact (n-1) 

正如你可以看到,有這與提供的條件匹配的模式的單個參數。

它被稱爲模式匹配功能和MSDN描述:Match Expressions (F#)

+1

我認爲這裏有一件令人煩惱的事情是'function'關鍵字,它並不完全對應於實際的功能。 – TeaDrivenDev