Как сделать перестановку из 7 символов, чтобы показать 4 символа? - PullRequest
1 голос
/ 18 июня 2020

Я хочу сделать перестановку с javascript, это мой код

const arr = [1, 2, 3, 4, 5, 6, 7];

for (let i1 = 0; i1 < arr.length; i1++) {
  for (let i2 = i1 + 1; i2 < arr.length; i2++) {
    for (let i3 = i2 + 1; i3 < arr.length; i3++) {
      for (let i4 = i3 + 1; i4 < arr.length; i4++) {
         console.log(arr[i1] + ' ' + arr[i2] + ' ' + arr[i3] + ' ' + arr[i4]);
      }      
    }
  }
}

https://jsfiddle.net/esw6c483/1/

результат этого кода:

["1 2 3 4", "1 2 3 5", "1 2 3 6", "1 2 3 7", "1 2 4 3", "1 2 4 5", "1 2 4 6", ...............]

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

["7 1 2 3", "7 1 2 4", "7 1 2 5" ..... etc]

скажите, пожалуйста, где ошибка из этого кода? или если у вас есть лучший код, пожалуйста, помогите Мне.

* пожалуйста, не используйте continue, если есть сходства в числах, потому что это только удаляет число, но делает процесс перестановки долгим. и по-моему это мне не помогает

Спасибо

Ответы [ 2 ]

2 голосов
/ 19 июня 2020

Проблема в том, что во внутренних циклах вы пропускаете первый элемент (начиная с i<em>N</em> + 1); что хорошо на первой итерации, но после этого будет пропущен неправильный элемент.

Итак, вместо этого вы можете проверить внешние индексы.

Использование операторов continue для этого не необходимо , но при правильном использовании не замедляет l oop и не пропускает возможные случаи. Замедление происходит из-за того, что рабочая версия повторяет больше вариантов, а не из-за continue.

const arr = [1, 2, 3, 4, 5, 6, 7];

for (let i1 = 0; i1 < arr.length; i1++) {
  for (let i2 = 0; i2 < arr.length; i2++) {
    if(i1 === i2) continue
    for (let i3 = 0; i3 < arr.length; i3++) {
      if([i1, i2].includes(i3)) continue
      for (let i4 = 0; i4 < arr.length; i4++) {
        if([i1, i2, i3].includes(i4)) continue
        console.log(arr[i1] + ' ' + arr[i2] + ' ' + arr[i3] + ' ' + arr[i4]);
      }      
    }
  }
}

В качестве альтернативы вы можете использовать рекурсивную функцию (я очень рекомендую это), которая устраняет дублирование кода и делает его более гибким.

Вот код Я отправил на ваш предыдущий вопрос , но относится и к этому:

const variations = (arr, n = arr.length) => {
  if(n === 0) return [[]]
  if(!(n >= 0)) return []
  const output = []
  for(let i = 0; i < arr.length; i++){
    if(arr.indexOf(arr[i]) < i) continue
    const newArr = arr.slice()
    newArr.splice(i, 1)
    output.push(...variations(newArr, n - 1).map(e => [arr[i], ...e]))
  }
  return output
}

const arr = [1, 2, 3, 4, 5, 6, 7];

console.log(variations(arr, 4))

//If you want to concatenate them, use:

console.log(variations(arr, 4).map(e => e.join(' ')))
/* Just to make console fill the available space */
.as-console-wrapper{min-height: 100% !important;}
0 голосов
/ 18 июня 2020

вы можете внести эти изменения в свой алгоритм, тогда он будет работать нормально

for (let i1 = 0; i1 < arr.length; i1++) {
  for (let i2 = 0; i2 < arr.length; i2++) {
    if (i2 != i1) {
      for (let i3 = 0; i3 < arr.length; i3++) {
        if(i2 != i3 &&  i3 != i1){
          for (let i4 = 0; i4 < arr.length; i4++) {
            if(i4 != i3 &&  i4 != i1 && i4!= i2){
              console.log(arr[i1] + ' ' + arr[i2] + ' ' + arr[i3] + ' ' + arr[i4])
            }
          }
        }
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...