Может кто-нибудь прояснить рекурсивный шаг в этой функции, который находит все возможные перестановки для строки?
Это не мой код, но был взят из другого места:
var permutations = [];
function doPerm(str, arr) {
if (typeof (str) == 'string') str = str.split('');
if (str.length == 0) permutations.push(arr.join(''));
for (var i = 0; i < str.length; i++) {
var x = str.splice(i, 1);
arr.push(x);
doPerm(str, arr);
arr.pop();
str.splice(i, 0, x);
}
Я понимаю алгоритм, лежащий в основе кода, но я не могу отследить, что происходит за рекурсией. Было бы очень полезно, если бы кто-нибудь нарисовал дерево на простом примере, где: str = 'abc'
1 ответ
Рекурсия просто использует алгоритм снова и снова для достижения желаемого результата. В этом случае вы звоните doPerm
который модифицирует str
, помещает это в arr
, а затем функция вызывает себя, чтобы выработать следующую перестановку.
Здесь действительно хорошая статья, объясняющая рекурсию.