-
-
Save pshezgyr/8442472 to your computer and use it in GitHub Desktop.
/** | |
* Напишите функцию, которая из произвольного входящего массива выберет все комбинации чисел, сумма которых будет равняться 10 | |
* | |
* @see http://company.yandex.ru/job/vacancies/dev_int_yaservices.xml | |
* @param {Array} ITEMS | |
* @param {Integer} target | |
* @example findCombinations([ 7, 10, 2, 5, 3, 1 ], 10) => [[7, 2, 1], [7, 3], [10], [2, 5, 3]] | |
* @returns {Array} | |
*/ | |
function findCombinations (ITEMS, target) | |
{ | |
var results = [], | |
i = 0, | |
l = ITEMS.length, | |
item; | |
for( ; i<l; i++ ) | |
{ // Проходим массив значений | |
item = ITEMS[i]; // Текущее значение | |
if( item > target ) continue; // Выходит за цель, отбросили, выходим | |
if( item == target ) { results.push([item]); continue; } // Оно, цепляем, выходим | |
var subResults = findCombinations(ITEMS.slice(i+1), target - item); // Ищем возможные варианты, исключая текущее значение | |
if( ! subResults.length ) continue;// Возможностей нет, отбросили, выходим | |
// console.log("subResults for", item, "is", subResults); // Все возможные варианты для текущего значения | |
for( var j=0, k=subResults.length; j<k; j++ ) | |
results.push([item].concat(subResults[j])); // Склеиваем результат | |
}; | |
return results; | |
}; | |
console.log( findCombinations([ 7, 10, 2, 5, 3, 1 ], 10) ); |
Мы добавили item, значит нужно искать target - item.
Т.е. сначала искали 10, на первом шаге добавили например 3, значит на следующем ищем 10-3=7.
@evgwpw, спасибо! Вроде всё ясно в коде, но прокрутить в голове как это работает не получается ))) даже в дебагере наблюдаю и не понимаю, что циклы выдают на каждой итерации ))))))
На первом шаге первая 7.
Она меньше 10
Сокращаем массив до [10, 2, 5, 3, 1 ] и в нем ищем массив, сумма цифр которого уже равно 3.
Сокращаем массив до [10, 2, 5, 3, 1 ] и в нем ищем массив, сумма цифр которого уже равно 3.
Это вроде как ясно, а когда функция доходит до единицы (наверное уже в 3 рекурсионной функции, запутался), единица добавляется в results, так ? И вот на дальнейшем этапе куда мы вылетаем и что ищем, не ясно? И мне как казалось далее в results должна была попасть тройка, но попала 2. )))))
2 + 7 < 10
в чём смысл выражения
target - item
на 23 строчке?