Является ли for (пусть i в строке) {} эквивалентным for (пусть i = 0; i <string.length; i ++) {}? - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть два фрагмента кода, которые я написал, полагаю, они должны работать одинаково.Как вы можете заметить, единственное, что отличается между ними - это объявление цикла for.

Почему код с for-in не работает должным образом?

Заранее спасибо.

const allPermutations1 = s => {
     let permutations = []

     const recursion = (s, p = '') => {

         if (s.length === 0) return permutations.push(p)

         for (let i = 0; i < s.length; i++)
             recursion(s.slice(0, i) + s.slice(i+1), p + s[i]) 
     }

     return (recursion(s), permutations)
 }

allPermutations1('123') // ["123", "132", "213", "231", "312", "321"]

const allPermutations2 = s => {
    let permutations = []

    const recursion = (s, p = '') => {

        if (s.length === 0) return permutations.push(p)

        for (let i in s)
            recursion(s.slice(0, i) + s.slice(i+1), p + s[i]) 
    }

    return (recursion(s), permutations)
}

allPermutations2('123') // ["123", "132", "21", "312", "321"]

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Цикл for...in перебирает ключи и возвращает строку.Когда вы применяете итератор i+1 внутри сращивания, вы возвращаете конкатенацию строк вместо увеличения значения.Например, '1' + '2' равно '12' вместо 3.Эта ситуация может вызвать проблемы при правильном сращивании чисел.Вам нужно проанализировать ключ к номеру для выполнения операции, как ожидалось.

0 голосов
/ 24 декабря 2018
const allPermutations2 = s => {
    let permutations = [];

    const recursion = (s, p = "") => {
        if (s.length === 0) return permutations.push(p);

        for (let i in s) {
            recursion(
                s.slice(0, parseInt(i)) + s.slice(parseInt(i) + 1),
                p + s[parseInt(i)]
            );
        }
    };
    return recursion(s), permutations;
};

даст тот же результат, что и первый.когда вы делаете для .. в ключах строки.

...