天天看點

F#大整數階乘

      在數學上,有時候需要計算階乘,即n! = 1 * 2 * 3 * ... (n - 1) * n ,由于int類型的長度限制,當n比較大的時候,則n!可能就無法得出正确的計算結果。此時就需要用到大整數類型bigint。

     下面介紹一下如何用F#語言實作一個計算階乘的函數,首先用int類型來進行定義,看看會發生什麼,代碼如下:

let rec fact n =
  match n with
  | i when i < 0 -> 0
  | 0 | 1 -> 1
  | _ -> n * fact(n-1) 
  ;;      

 在指令行輸入 dotnet fsi進入F#互動界面,并首先執行fact函數定義,然後依次進行測試:

F#大整數階乘

當 n = 3時,則 計算結果為 6 ,可當n=20時,計算結果應該為2432902008176640000,但是輸出結果卻為負數,說明已經超出int長度了,無法正确給出計算結果。下面用大整數bigint來解決這個問題。将上述代碼修改如下:

let rec bfact (n) : bigint = 
    match n with
        | i when i < 0 -> bigint.Zero
        | 0 | 1 -> bigint(1)
        | _ -> (bfact(n-1) * bigint(n)) 
        ;;      

其中的rec代表函數是一個遞歸函數,bigint類型代表大整數類型,match with進行模式比對,when後面可以根據條件來進行比對,其中的bigint(n)可以将普通的數值n轉換成bigint類型。執行此示例,截圖如下:

F#大整數階乘

繼續閱讀