Я помогаю кому-то в его школьном задании — мы пытаемся написать рекурсивную функцию (если это имеет значение — либо в PHP, либо в JavaScript).
Я хорошо понимаю принципы рекурсии, но я не написал ни одного из них с «академической» точки зрения.
Это хорошая практика, чтобы использовать глобальную переменную для хранения результата, что-то вроде:
var results = [];
var rec = function(a) {
...
if (match)
results.push(someValue);
}
Или я должен использовать возврат для сбора всех этих результатов вместе (что было бы гораздо сложнее)?
Хорошей практикой является использование как можно меньшего числа глобальных переменных, предпочтительно ни одной1.
Чтобы избежать необходимости использования глобальной переменной в рекурсии, вы можете использовать внутреннюю функцию, которая использует замыкание:
var rec = function(a) {
var someValue = [];
function dorec() {
// stuff happens
if (match)
results.push(someValue);
}
}
dorec();
}
1 Дуглас Крокфорд состояния
Все переменные должны быть объявлены перед использованием. JavaScript не
требуется, но это делает программу легче для чтения и делает
легче обнаружить необъявленные переменные, которые могут стать подразумеваемыми
Глобал. Подразумеваемые глобальные переменные никогда не должны использоваться. Использование глобального
переменные должны быть минимизированы.
Чтобы расширить существующие комментарии и дать вам конкретный пример, вот код для рекурсивного добавления четных чисел к данному массиву:
var match;
var rec = function(a, res) {
if (a < 0) {
return res;
}
match = a % 2 == 0;
if (match) {
res.push(a);
}
return rec(a - 1, res);
}
var results = rec(10, []);
alert(results);
и скрипка: http://jsfiddle.net/xukukggL/