diff options
| author | Sam Anthony <sam@samanthony.xyz> | 2024-02-05 11:47:30 -0500 |
|---|---|---|
| committer | Sam Anthony <sam@samanthony.xyz> | 2024-02-05 11:47:30 -0500 |
| commit | 288101b54b0234ffb679ad6f91b93ac7c1309e84 (patch) | |
| tree | a718fc26a1b073b47b8609815b8da28f21058de5 /func.go | |
| parent | 8f62185202f18d969c6db0725e7024ad93d34564 (diff) | |
| download | pfc-288101b54b0234ffb679ad6f91b93ac7c1309e84.zip | |
add combination (n choose k) function
Diffstat (limited to 'func.go')
| -rw-r--r-- | func.go | 32 |
1 files changed, 32 insertions, 0 deletions
@@ -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 } |