2014-10-09 2 views
2

Цель состоит в том, чтобы определить, равна ли любая комбинация целых чисел в массиве наибольшим целым числом в массиве.JavaScript Recursion

function ArrayAdditionI(arr) { 
    arr.sort(function(a,b){ 
    return a - b; 
    }); 
    var largest = arr.pop(); 
    function recursion(target,array){ 
    if(array.length === 0){ 
     return target === 0; 
    } 
    var n = array[0]; 
    array = array.slice(1); 
    return recursion(target,array) || recursion(target - n, array); 
    } 
    return recursion(largest,arr);   
} 

Это решение работает, но я не могу его проследить. В нижней части функции рекурсии, когда она достигает правой части оператора OR, я думаю, что она почти всегда возвращает false, однако она продолжает рекурсию. Может кто-нибудь объяснить?

ответ

1

Это или условие в конце, которое делает функцию проверкой всех комбинаций.

Функция сбрасывает число из массива, затем проверяет, можно ли найти запрос без этого номера или с этим номером.

Если вы, например, имеете массив [1,2,3,6], давайте перейдем к части рекурсии, которая находит решение. Сначала код выберет 6, а затем вызовет рекурсивную функцию для поиска суммы 6 в [1,2,3].

Функция будет сбрить 1, а затем проверить, если либо сумма 6 можно найти в [2,3], или если сумма 5 (6-1) можно найти в [2,3].

Рекурсивный вызов во втором случае будет сбрить 2 из массива, а затем проверить, если сумма 5 можно найти в [3], или если сумма 3 (5-2) можно найти в [3].

Рекурсивный вызов во втором случае будет сбрить 3 из массива (оставляя его пустым), а затем проверить, если 3 можно найти в [], или если 0 (3-3) можно найти в [].

Рекурсивный вызов для второго случая будет соответствовать условию в начале функции и возврату true.

+0

Хорошо. Я не понимал, что он сохраняет значения переменных, поскольку он продолжал выполнять левую часть оператора или. Создает ли это закрытие, не заканчивая заявление? Или просто в резервном копировании в строке стека вызовов? Или оба? –

+0

@MattLarsh: параметры и переменная 'n' являются локальными для функции, поэтому каждый вызов функции получает свой собственный набор из них. Точно так же, как это реализовано в Javascript, не определено, но оно имеет тот же эффект, что и параметры, которые нажимаются на стек для вызова, и комната помещается в стек для переменной 'n'. – Guffa