Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вопрос по циклам (https://javascript.ru/forum/misc/58946-vopros-po-ciklam.html)

batcave 19.10.2015 12:38

Вопрос по циклам
 
Здравствуйте. Задание было таким:
"Запросите количество строк и выведите соответствующий треугольник
$
$$
$$$
$$$$
$$$$$"
Решение оказалось таким:
var rows = +prompt('Введите количество строк', 5);
   for(var i = 1; i <= rows; i++){
      for(var n = 0; n < i; n++){ 
         document.write('$');
      }
   document.write('</br>');
   }

Собственно, в чем загвоздка. На каждой строке выводится +1 символ '$'. Т.е. на каждой новой строке document.write повторяется на 1 больше раз. Ок. Но почему-то тогда </br> из внешнего цикла повторяется только 1 раз на каждой итерации? Конструкция циклов фактически одинаковая, но почему во внешнем цикле переменная i отвечает за количество строк, а не за вывод document.write, в то время как во внутреннем цикле переменная n отвечает как раз таки за количество повторений document.write за одну итерацию?

EmperioAf 19.10.2015 14:07

Цитата:

Сообщение от batcave
Т.е. на каждой новой строке document.write повторяется на 1 больше раз. Ок. Но почему-то тогда </br> из внешнего цикла повторяется только 1 раз на каждой итерации? Конструкция циклов фактически одинаковая, но почему во внешнем цикле переменная i отвечает за количество строк, а не за вывод document.write, в то время как во внутреннем цикле переменная n отвечает как раз таки за количество повторений document.write за одну итерацию?

а вам не всё равно, если этот код работает и он практически оптимален?
Попробуйте написать этот код на бумаге и попробуйте "прочитать" и осознать что делает каждая часть кода. И когда вы поймёте как он работает, попробуйте решить похожую задачу (чтобы треугольник был по другую сторону от диагонали)

ksa 19.10.2015 16:12

Цитата:

Сообщение от EmperioAf
он практически оптимален

Неа... :no:
Одним циклом все делается...

batcave, это букварская задачка. Предполагается, что даже новичок ее сможет сделать, прочитав учебник по JS...
Но ты даже по готовому примеру так и не понял как все это работает. :(

EmperioAf 19.10.2015 16:21

Цитата:

Сообщение от ksa
Неа...

ну вообще то первое что приходит на ум, это пройти двумя циклами от 0 до n и поставить условие if (i>=j).
Т.ч. то, что предлагается это не худший вариант

ksa 19.10.2015 16:23

Цитата:

Сообщение от EmperioAf
первое что приходит на ум

Просто приклеивать символ в цикле приходит только после 100г? :D

<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251' />
<!--
<script src='http://code.jquery.com/jquery-latest.js'></script>
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
-->
<style type='text/css'>
</style>
<script type='text/javascript'>
var rows = +prompt('Введите количество строк', 5);
var str='';
for(var i = 1; i <= rows; i++){
	str+='$'
	document.write(str+'</br>');
}
</script>
</head>
<body>
</body>
</html>

Цитата:

Сообщение от EmperioAf
то, что предлагается это не худший вариант

Дык я с этим не спорю... :no:

batcave 19.10.2015 16:31

Если не затруднит, подскажите что дальше.
1) Пользователь вводит значение в prompt, например 3.
2) Начинает работу внешний цикл. i=1. 1 < 3. Условие верно, выполняем тело.
3) В теле внутренний цикл. В нем n=0. 0<1. Условие верно. Выполняем тело.
4) Выполняет document.write('$'). На странице выводится символ $.
5) Выполняется шаг n++. n = 1.
6) Внутренняя итерация завершена. Теперь происходит внешняя. Document.write добавляет на страницу </br>, делая тем самым переход на новую строку.
7) Выполняется шаг. i = 2.

Полный цикл завершен. Теперь начинается второй:
8) Проверяем условие. i = 2. 2 < 3. Условие верно. Переходим к внутренней функции.
9) n = 1. 1 < 2. верно. выполним тело.
10) document.write срабатывает дважды. Почему? Почему он просто не повторит его один раз, как делает внешний цикл с <br>? он считает 0 и 1 как "сработай на этой строке 2 раза"?

EmperioAf 19.10.2015 17:38

Цитата:

Сообщение от batcave
10) document.write срабатывает дважды. Почему? Почему он просто не повторит его один раз, как делает внешний цикл с <br>? он считает 0 и 1 как "сработай на этой строке 2 раза"?

серьёзно?
попробуйте перечитать:
https://learn.javascript.ru/while-for#цикл-for

batcave 19.10.2015 23:50

Окей, я понял, что внутренний цикл повторяется i количество раз. Но почему это происходит - нет. И по ссылке там нет никакого подобия объяснения. Можно провести аналогию с электронными часами. Часы слева увеличиваются на 1 после того, как минуты справа увеличатся на 60. Вопрос теперь приобретает другую форму - почему внутренний цикл повторяется i количество раз?
----------
Значение n не имеет отношения к количеству символов. Это просто проверка условия. А вот i - это количество повторения внутреннего цикла. Ура. Похоже это оно.
----------
ААААА. Кажется понял. Во внутреннем цикле на каждой новой строке n обнуляется, а i увеличивается, оттого то все так и работает.


Часовой пояс GMT +3, время: 15:25.