Fish Wang says to YSITD
function calc_(current, remain, types, result) { var ended = true; var i; for (i = 0; i < types.length; i++) { if (remain - types[i] >= 0) { ended = false; calc_(current.concat([types[i]]), remain - types[i], types.slice(i), result) } } if (ended) { result.push(current.slice(0)); } return result; }