У вас есть пара проблем:
- Вы используете неправильное уравнение для
C(n,r)
.
- Вы игнорируете пару граничных условий в ваших факториалах и
C(n,r)
реализациях.
Правильная формула для биномиального коэффициента :
n!
C(n,r) = ----------
r!(n - r)!
На граничных условиях.
По определению 0!
- это 1
, поэтому вы должны заключить свои inject
в другую лямбду:
factorial = ->(n) { n == 0 ? 1 : (1..n).inject(:*) }
Кроме того, C(n,r)
равно нулю, если n < r
, поэтому вы должны проверить это.
combinations = ->(n, r) do
if(n < r)
0
else
factorial[n] / (factorial[r] * factorial[n - r])
end
end
Вы также можете закорачивать корпуса n == r
и r == 0
и не беспокоиться о 0!
:
factorial = ->(n) { (1..n).inject(:*) }
combinations = ->(n, r) do
if(n < r)
0
elsif(n == r || r == 0)
1
else
factorial[n] / (factorial[r] * factorial[n - r])
end
end
Поскольку вы явно имеете дело с комбинациями, вы, вероятно, можете спокойно игнорировать случаи n < 0
и r < 0
, но вы также можете добавить проверки для них.