所以問題是我想在 OCaml 中做一個組合數字函式,我有以下代碼:
let rec fact: int -> int = fun num ->
let rec help: int -> int -> int = fun n acc ->
if n>0 then help (n-1) (acc * n)
else acc
in
help num 1;;
然后是梳子功能:
let comb (m,n) =
fact m / fact (m-n) / fact n;;
我認為奇怪結果的問題是遞回,但是在實作尾遞回實際上函式之后,我仍然得到相同的結果,例如 de comb (66, 2) Exception: division_by_zero or fact 22 = huge negative number, whats這里的問題?
uj5u.com熱心網友回復:
您正在使用太大而無法放入 OCaml int 的值。僅舉一個例子,事實 66 是 544344939077443064003729240247842752644293064388798874532860126869671081148416000000000000000
這太大了,甚至無法放入 64 位整數。
如果你想在 OCaml 中處理這么大的數字,你應該使用Zarith模塊。
另一種選擇是重寫您的函式以避免如此大的中間值。這是一個comb可以計算的版本comb 66 2:
let comb m n =
let rec icomb num den m n =
if n <= 0 then num / den
else icomb (num * m) (den * n) (m - 1) (n - 1)
in
icomb 1 1 m n
# comb 66 2;;
- : int = 2145
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/520611.html
標籤:递归ocaml尾递归阶乘
