Может кто-нибудь прояснить рекурсивный шаг в этой функции, который находит все возможные перестановки для строки?

Это не мой код, но был взят из другого места:

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, а затем функция вызывает себя, чтобы выработать следующую перестановку.

Здесь действительно хорошая статья, объясняющая рекурсию.

Другие вопросы по тегам