Evaluate binomial coefficients: Difference between revisions
Content added Content deleted
(→Functional: Removed obfuscated Python solution.) |
|||
Line 1,895: | Line 1,895: | ||
return int( reduce( mul, range((n-r+1), n+1), 1) / |
return int( reduce( mul, range((n-r+1), n+1), 1) / |
||
reduce( mul, range(1,r+1), 1) )</lang> |
reduce( mul, range(1,r+1), 1) )</lang> |
||
Or, updating for Python 3, and abstracting a little more for legibility and ease of reuse, while currying for ease of mapping and general composition: |
|||
<lang python>from functools import reduce |
|||
# binomialCoefficient :: Int -> Int -> Int |
|||
def binomialCoefficient(n): |
|||
return lambda k: product( |
|||
enumFromTo(1 + k)(n) |
|||
) // factorial(n - k) |
|||
# GENERIC ------------------------------------------------- |
|||
# enumFromTo :: Int -> Int -> [Int] |
|||
def enumFromTo(m): |
|||
return lambda n: range(m, 1 + n) |
|||
# factorial :: Int -> Int |
|||
def factorial(x): |
|||
return product(enumFromTo(1)(x)) |
|||
# product :: [Num] -> Num |
|||
def product(xs): |
|||
return reduce(lambda a, b: a * b, xs, 1) |
|||
# TESTS --------------------------------------------------- |
|||
print( |
|||
binomialCoefficient(5)(3) |
|||
) |
|||
# k=0 to k=5, where n=5 |
|||
print( |
|||
list(map( |
|||
binomialCoefficient(5), |
|||
enumFromTo(0)(5) |
|||
)) |
|||
)</lang> |
|||
{{Out}} |
|||
<pre>10 |
|||
[1, 5, 10, 10, 5, 1]</pre> |
|||
=={{header|R}}== |
=={{header|R}}== |