@helpmeplease196

Зачем нужен вложенный цикл while в этом коде?

Задача вывести массив двузначных чисел, у которых совпадают десятки и единицы в каждой последующей итерации (то есть 29-62-36).

Этот код работает некорректно, это просто случайные числа

let arr=[]
let length = +prompt("введите число")
let ten
let union
let num
let i = 2

num = Math.floor(Math.random() * (99 - 10 ) + 10)
arr.push(num)

while (i<=length){
 ten=Math.floor(num / 10)
 num = Math.floor(Math.random() * (99 - 10 ) + 10)
    union= num% 10
    if(union===ten){
        arr.push(num)
        i++
    }
} 
alert(arr)


Но если добавить вложенный цикл while, то все работает:

let arr=[]
let length = +prompt("введите число")
let ten
let union
let num
let i = 2

num = Math.floor(Math.random() * (99 - 10 ) + 10)
arr.push(num)

while (i<=length){
 ten=Math.floor(num / 10)
 union=-1
 while(union!=ten){
 num = Math.floor(Math.random() * (99 - 10 ) + 10)
    union= num% 10}
    if(union===ten){
        arr.push(num)
        i++
    }
} 
alert(arr)


Почему?

В первом варианте вижу последовательность так?
1) зашли в цикл, значение ten берется из внешней переменной num/
2)создаем новое рандомное число
3) выделяем единицу из нового num
4) сравниваем значение ten (из внешней переменной) и union из нового num
//5) заходим снова в цикл
6) уже берем ten из прошлого внутрицикличного значения ten
7) переназначаем ten
8) узнаем из нового ten новый union
9) сравниваем ten, сохранивший значения еще с первой итерации и сравниваем с новым union
10......И далее так по кругу пока цикл не завершится.
Но как видно на практике, это работает нет так. Почему?

Зачем во втором варианте создается еще один цикл, и зачем изначально значение union=-1, что бы каждый раз попадать во вложенный цикл....?
  • Вопрос задан
  • 131 просмотр
Пригласить эксперта
Ответы на вопрос 2
402d
@402d
начинал с бейсика на УКНЦ в 1988
ten=Math.floor(num / 10)
while (i<=length){
    num = Math.floor(Math.random() * (99 - 10 ) + 10)
    union= num% 10
   if(union===ten){
        arr.push(num)
        ten=Math.floor(num / 10) 
        i++
    }
}


попробуй оно ?
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Вместо того, чтобы перебирать случайные числа, ожидая, когда совпадут нужные цифры, надо брать нужную цифру и генерировать только остальные.
const chain = (n) => Array(n)
  .fill(1)
  .map(() => Math.floor(Math.random() * 9) + 1)
  .map((v, i, a) => v + (a[i + 1] ?? (Math.floor(Math.random() * 9) + 1)) * 10);
chain(10); // [ 75, 87, 48, 54, 75, 27, 92, 69, 56, 25 ]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы