OCaml预测值为0

OCaml预测值为0,ocaml,sequence,factorial,Ocaml,Sequence,Factorial,我想要一个计算纳拉亚纳数的代码 但是,对于超过20的数字,它开始显示“0” 什么可能会失败 let rec factorial n = if n <= 1 then 1 else factorial (n-1) * n;; 让rec阶乘n= 如果n你遗漏了一段代码,那就是factorial(n)作为分子: let binomial_coeff (n:int) (k:int) = if k = 0 || k = n then 1 else factorial

我想要一个计算纳拉亚纳数的代码

但是,对于超过20的数字,它开始显示“0”

什么可能会失败

let rec factorial n =
    if n <= 1 then 1
    else factorial (n-1) * n;;
让rec阶乘n=

如果n你遗漏了一段代码,那就是
factorial(n)
作为分子:

let binomial_coeff (n:int) (k:int) =
    if k = 0 || k = n then 1
    else factorial (n) / (factorial (k) * factorial (n-k));;

您遗漏了一段代码,即
阶乘(n)
作为分子:

let binomial_coeff (n:int) (k:int) =
    if k = 0 || k = n then 1
    else factorial (n) / (factorial (k) * factorial (n-k));;

factorial 21
溢出并返回不正确的结果。 在我的64位设置中,
max_int
的值是4611686018427387903,刚好在20之间!还有21


为了解决这个问题,您可以避免实际计算n的值!(或k!)ub
二项系数
。而是计算更复杂的值。例如,而不是
n/k,您可以使用
(k+1)*(k+2)*…*n

factorial21
溢出并返回不正确的结果。 在我的64位设置中,
max_int
的值是4611686018427387903,刚好在20之间!还有21


为了解决这个问题,您可以避免实际计算n的值!(或k!)ub
二项系数
。而是计算更复杂的值。例如,而不是
n/k,您可以使用
(k+1)*(k+2)*…*n

你在第三行写了
fatorial
而不是
factorial
你在第三行写了
fatorial
而不是
factorial
“它开始显示“0”?什么是“它”?这不是阶乘函数,正如其他人指出的那样,它的溢出量超过了20。您应该包含生成0的代码。“它开始显示“0”?什么是“它”?这不是阶乘函数,正如其他人指出的那样,它的溢出量超过了20。您应该包含生成0的代码。