2015-12-22 2 views
-1

Я пытаюсь получить код, который нужно запустить, но застрял. У меня есть массив размеров var sizes = [1,2];, и у меня есть длина, я хочу достичь len = 3;. Я хочу напечатать все возможности для достижения этой длины, используя мои заданные размеры, то есть: [1,1,1], [2,1], [1,2].Javascript: печать всех возможных перестановок для получения суммы

Я попытался это до сих пор:

var sizes = [1,2]; // possible sizes to pick 
var start_len = 3; // length I want to reach 
var arr = []; 

var main = function(len){ 
    if(len == 0){arr = [];} //clear the array after I got to full length 
    if(len >= 1){   // try adding 1 
     B(1,len, arr); 
    } 
    if(len >= 2){   // try adding 2 
     B(2,len, arr); 
    } 
} 
var add_and_call_again= function(elem, len, arr){ 
    arr.push(elem); 
    if(len-elem == 0){ // if got to full length 
     console.log(arr); 
    } 
    main(len-elem);  // add next element with less length to fill 
}  
main(start_len); 

Что я получил [1,1,1] и [2,1], а также [2] - не уверен, что пошло не так. Заранее спасибо.

EDIT: Мой вопрос показывает мой код, но то, что я хочу понять, является псевдокодом для этого. Мне не хватает чего-то, и я не знаю, что

+4

Слишком загадочный. Используйте значащие имена в своем коде и объясните это. Кроме того, используйте отладчик (переполнение стека ** не является отладчиком **) – Amit

+0

Поиск проблемы ранца в google, похоже, похоже –

+0

Что это за функция 'B'? – SteamDev

ответ

1

Рекурсивный поиск по глубине - лучший вариант для таких задач. Универсальный код (любые размеры, любые цели):

var sizes = [1, 2]; // possible sizes to pick 
var start_len = 3; 

function dfs(current_len, path){ 
    var res = []; 
    sizes.forEach(function(s){ 
     var temp_res; 
     if (s==current_len) 
      res.push(path.concat([s])); 
     else if (s<current_len) 
      temp_res = dfs(current_len-s, path.concat([s])); 
     if (temp_res) 
      res = res.concat(temp_res); 
    }); 
    if (res.length) 
     return res; 
} 

var paths = dfs(start_len, []); 
console.log(paths); 
+0

ваш код дает «[Array [3], Array [2], Array [2]]», но мне нужны сами элементы {1,1,1}, {1,2}, {2,1} и {3 } – CIsForCookies

+1

console.log (пути); дает [[1, 1, 1], [1, 2], [2, 1]]. Если вы видите Array [3] - это просто означает, что console.log не показывает встроенные массивы в вашем случае –

Смежные вопросы