Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Объясните как работает код (https://javascript.ru/forum/project/49309-obyasnite-kak-rabotaet-kod.html)

wolf_ 06.08.2014 23:24

Объясните как работает код
 
Помогите разобратся как работает код.
вот например что проверяет эта строка кода if( ! subResults.length );

почему item в скобках results.push([item].concat(subResults[j]))
и как здесь работает рекурсия

* Напишите функцию, которая из произвольного входящего массива выберет все комбинации чисел, сумма которых будет равняться 10
 *
 * @see [url]http://company.yandex.ru/job/vacancies/dev_int_yaservices.xml[/url]
 * @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) );


Часовой пояс GMT +3, время: 04:00.