Не срабатывает третий цикл

123
17 ноября 2020, 19:50

Нужно привести к такому виду:

> *****
****
***
**
*
**
***
*****
******

где n7 это число звездочек.Не работает 3й цикл.

function task7(n7) {
  for (var i = 0; i < n7; n7--) {
    for (var j = 1; j < n7; j++) {
      process.stdout.write("*");
    };
    console.log('*');
  };
  var result = "";
  for (var k = 1; k < n7; k++) { // не работает, хотя отдельной функцией работает.
    result = `${result}*`;
    console.log(result);
  };
}
task7(n7);

Ведь первые два цикла проходят и доходит очередь до 3го, но он даже не стартуется. Где нарушена моя логика?

Answer 1

Когда дело доходит до 3го цикла n7 равно 0. Соответственно, цикл не запускается

Answer 2

Ваше же решение чуть короче:

  • заранее узнаем число итераций i = (n - 1) * 2 + 1 и в каждой итерации цикла печатаем звёздочку len-раз с помощью метода строки repeat
  • в конце итерации меняем длину в большую или меньшую сторону с помощью вектора len += vector
  • разворачиваем вектор с направления уменьшения в сторону увеличения как только достигнем минимума (единичной длины строки со звёздочками) == 1 && (vector = 1)

(function(n){ 
  for ( 
    let i = (n - 1) * 2 + 1, 
        len = n, 
        vector = -1; 
     i--; 
  ) { 
    console.log('*'.repeat(len)); 
    (len += vector) == 1 && (vector = 1); 
  } 
})(4);

Можно сделать ещё проще, если найти формулу зависимости числа звёздочек от номера строки. Для этого повернём голову на 90 градусов вправо глядя на ваш вопрос. Получится примерно такая картинка:

В глаза бросаются оси OX и OY. Проведём по макушкам звёздочек две прямые: первая из точки {0, 5} в {4, 1}, а вторая из {4, 1} в {8, 5}. Теперь найдём Уравнение прямой, проходящей через две заданные несовпадающие точки для каждой из них.

(y1 - y2) * x + (x2 - x1) * y + (x1 * y2 - x2 * y1) = 0

Для первой получаем y = 5 - x, для второй y = x - 3, где x - номер итерации в вашем цикле, а y - число звёздочек для repeat-функции. Осталось добавить в цикле проверку на пересечение середины графика. До него используете первую формулу, после - вторую.

READ ALSO
Как передать значение select в php Mailer?

Как передать значение select в php Mailer?

Обратная связь на сайте реализована с помощью библиотеки php mailerВозникла необходимость передачи выбранного значения тега select

107
Изменение css через js onclick

Изменение css через js onclick

Здравствуйте, при таком использовании, действие происходит по правилам тоглера, те

123
Копирование блока

Копирование блока

как сделать что бы наведении на блок, на сайте предлагало копировать текст ?

151
Дождаться завершения потоков

Дождаться завершения потоков

В цикле запускаю n потоков

178