OCaml Фаториал 0 - PullRequest
       38

OCaml Фаториал 0

0 голосов
/ 03 октября 2018

Я хочу иметь код, который вычисляет числа Нараяны.https://en.wikipedia.org/wiki/Narayana_number

Тем не менее, он начинает отображать '0' для чисел свыше 20.

Что может быть не так?

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

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

factorial 21 переполняется и возвращает неверный результат.Значение max_int в моей 64-битной установке составляет 4611686018427387903, что составляет всего лишь 20!и 21!.

Чтобы обойти это, вы можете избежать фактического вычисления значения n!(или к!) уб binomial_coeff.Вместо этого рассчитайте более сложные значения.Например, вместо n!/k! вы можете использовать (k+1)*(k+2)*...*n.

0 голосов
/ 03 октября 2018

Вы пропустили кусок кода, то есть factorial (n) в качестве числителя:

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