Вот моя попытка решить вашу проблему в javascript:
// the numbers to add
var finishingNumbers = [60, 57, 54, 51, 50, 48, 45, 42, 40, 39, 38, 36, 34, 33, 32, 30, 28, 27, 26, 25, 24, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1];
// The number
var output = 167;
// The variable for the end result
var dartsToFinishArr = [];
for (let i = 0; i < finishingNumbers.length; i++) {
const element1 = finishingNumbers[i];
if (element1 === output) {
dartsToFinishArr = [element1];
return;
}
for (let j = 0; j < finishingNumbers.length; j++) {
const element2 = finishingNumbers[j];
if (element1 + element2 == output) {
dartsToFinishArr = [element1, element2];
return;
}
for (let k = 0; k < finishingNumbers.length; k++) {
const element3 = finishingNumbers[k];
if (element1 + element2 + element3 === output) {
dartsToFinishArr = [element1, element2, element3];
return;
}
}
}
}
Это похоже на довольно типичный случай "как отладить небольшую программу" , и я настоятельно рекомендую прочитать весь пост в блоге, поскольку это значительно улучшит ваши навыки программирования.
Теперь, когда у нас есть рабочее решение, давайте повеселимся! Это решение соответствует вашим требованиям, но вы заметили, что у меня есть 3 вложенных цикла. Это неплохо, но если бы ваши требования изменились, чтобы в вашем решении было любое количество чисел , мой код быстро взорвался бы в беспорядке копирования и вставки. Можем ли мы построить решение, которое учитывает количество чисел в решении и всегда сможет рассчитать его? Вы держите пари! Это идеальный сценарий для рекурсии .
Вот более сложное, но более общее решение вашей проблемы:
// the numbers to add
var finishingNumbers = [60, 57, 54, 51, 50, 48, 45, 42, 40, 39, 38, 36, 34, 33, 32, 30, 28, 27, 26, 25, 24, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1];
// The number
var output = 167;
// The variable for the end result
var dartsToFinishArr = [];
// The maximum amount of numbers allowed in the solution;
const maxNumbers = 3;
function sum(total, element) {
return total + element;
}
function recursiveSolution(possibleSolution) {
for (let element of finishingNumbers) {
// Special case when we haven't added anything to the solution yet
var total = element;
if (possibleSolution.length > 0) {
total = possibleSolution.reduce(sum) + element;
}
if (total === output) {
dartsToFinishArr = possibleSolution;
dartsToFinishArr.push(element);
//Solution found, return recursively.
return true;
}
if (total < output && possibleSolution.length < maxNumbers - 1) {
//There's room for more numbers, continue recursively
const newPossibleSolution = possibleSolution.slice(0);
newPossibleSolution.push(element);
if (recursiveSolution(newPossibleSolution)) {
//The recursion worked, return recursively.
return true;
}
}
}
//We tried everything with the current possible solution. Let's backtrack one number and try the next one.
return false;
}
// Start the recursion with an empty solution
recursiveSolution([]);
console.debug(dartsToFinishArr);
Теперь вы можете изменять maxNumbers и получать любое решение, какое захотите!