Skip to content

Instantly share code, notes, and snippets.

@pshezgyr
Created January 15, 2014 19:16
Show Gist options
  • Save pshezgyr/8442472 to your computer and use it in GitHub Desktop.
Save pshezgyr/8442472 to your computer and use it in GitHub Desktop.
Напишите функцию, которая из произвольного входящего массива выберет все комбинации чисел, сумма которых будет равняться 10
/**
* Напишите функцию, которая из произвольного входящего массива выберет все комбинации чисел, сумма которых будет равняться 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) );
@swimmwatch
Copy link

swimmwatch commented Sep 17, 2016

в чём смысл выражения target - item на 23 строчке?

@evgwpw
Copy link

evgwpw commented Dec 9, 2016

Мы добавили item, значит нужно искать target - item.
Т.е. сначала искали 10, на первом шаге добавили например 3, значит на следующем ищем 10-3=7.

@leonov-nic
Copy link

@evgwpw, спасибо! Вроде всё ясно в коде, но прокрутить в голове как это работает не получается ))) даже в дебагере наблюдаю и не понимаю, что циклы выдают на каждой итерации ))))))

@evgwpw
Copy link

evgwpw commented Feb 3, 2023

На первом шаге первая 7.
Она меньше 10
Сокращаем массив до [10, 2, 5, 3, 1 ] и в нем ищем массив, сумма цифр которого уже равно 3.

@leonov-nic
Copy link

Сокращаем массив до [10, 2, 5, 3, 1 ] и в нем ищем массив, сумма цифр которого уже равно 3.
Это вроде как ясно, а когда функция доходит до единицы (наверное уже в 3 рекурсионной функции, запутался), единица добавляется в results, так ? И вот на дальнейшем этапе куда мы вылетаем и что ищем, не ясно? И мне как казалось далее в results должна была попасть тройка, но попала 2. )))))

@evgwpw
Copy link

evgwpw commented Feb 3, 2023

2 + 7 < 10

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment