From 288101b54b0234ffb679ad6f91b93ac7c1309e84 Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Mon, 5 Feb 2024 11:47:30 -0500 Subject: add combination (n choose k) function --- func.go | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'func.go') diff --git a/func.go b/func.go index 039cb4f..bc8a0bc 100644 --- a/func.go +++ b/func.go @@ -18,6 +18,8 @@ func parseFunction(fn string) func(*Calculator) { return rad case "fac": return fac + case "ch": // choose + return combination } return nil } @@ -98,6 +100,36 @@ func fac(c *Calculator) { c.stack.push(float64(factorial(uint(n)))) } +// Combination function. "n choose k" with integers n and k such that n >= k >= 0. +func combination(c *Calculator) { + k, err := c.stack.pop() + if err != nil { + return + } + if !isUint(k) { // undefined on non-ints + c.stack.push(k) + return + } + + n, err := c.stack.pop() + if err != nil { + c.stack.push(k) + return + } + if !isUint(n) { // undefined on non-ints + c.stack.push(n) + return + } + + if k > n || n < 0 || k < 0 { + c.stack.push(n) + c.stack.push(k) + } else { + n, k := uint(n), uint(k) + c.stack.push(float64(factorial(n) / (factorial(k) * factorial(n-k)))) + } +} + func degToRad(deg float64) (rad float64) { return deg * math.Pi / 180.0 } -- cgit v1.2.3