fix(combinations-replacement): return an empty list for a non-positive group size

combinationsReplacement recurses on x.slice(i, x.length), which at i = 0 is
as long as the input, so the only exit left is the k === 1 base case. For
k <= 0 the counter starts below that case and moves away from it, and the
recursion overflows the stack. The sibling combinations recurses on
x.slice(i + 1, x.length), runs out of input and returns [] for the same
arguments.

Guard the non-positive group size up front so both functions agree.
This commit is contained in:
dualfroz committed 2026-09-03 14:04:54 +02:00
1 parent 1aa682fd34
commit 24fe35e78e
3 files changed
+38

No files matched your search

+23
View File
@@ -15,4 +15,27 @@ describe("combinations", function () {
[2, 2]
]);
});
it("returns no combinations when choosing zero at a time", function () {
assert.deepEqual(
ss.combinationsReplacement(Object.freeze([1, 2, 3]), 0),
[]
);
});
it("returns no combinations for a negative group size", function () {
assert.deepEqual(
ss.combinationsReplacement(Object.freeze([1, 2, 3]), -1),
[]
);
});
it("agrees with combinations on non-positive group sizes", function () {
const x = Object.freeze([1, 2, 3]);
assert.deepEqual(
ss.combinationsReplacement(x, 0),
ss.combinations(x, 0)
);
assert.deepEqual(
ss.combinationsReplacement(x, -1),
ss.combinations(x, -1)
);
});
});