Логика вывода сообщений в console.log
<script>
function sumTo(n)
{
console.log("bla 1");
if (n == 3) return n;
console.log("bla 2");
res=sumTo(n-1) + sumTo(n-1);
console.log("bla 3");
return res;
}
alert( sumTo(5) );
</script>
Не получается логически понять вывод в консоль некоторых моментов, а именно: bla 1 // выполнится от 5 еще до проверки условия n==3 и до вызова sumTo(n-1) bla 2 // выполнится от 5 после проверки условия n==3, но до вызова sumTo(n-1) bla 1 // 1й вызов. выполнится от 4 еще до проверки условия n==3 bla 2 // выполнится когда же и предыдущий поскольку счет пошел дальше после проверки условия bla 1 // 2й вызов. выполнится от 3 счет дальше не пошел запоролся условием bla 1 // откуда? bla 3 // откуда? bla 1 bla 2 bla 1 bla 1 bla 3 bla 3 |
bla 1 // выполнится от 5 еще до проверки условия n==3 и до вызова sumTo(n-1)
да bla 2 // выполнится от 5 после проверки условия n==3, но до вызова sumTo(n-1) да bla 1 // 1й вызов. выполнится от 4 еще до проверки условия n==3 да bla 2 // выполнится когда же и предыдущий поскольку счет пошел дальше после проверки условия да bla 1 // 2й вызов. выполнится от 3 счет дальше не пошел запоролся условием нет! Второй уровень вложенности рекурсии! bla 1 // откуда? Второй уровень вложенности, второй вызов Думаю, дальше понятно |
helpmepls, выполняй код пошагово.
|
Или так:
console.log("bla 1, n="+n); |
вроде понял?
Цитата:
Код:
function sumTo(n) bla 1 // выполнится от 5 еще до проверки условия n==3 и до вызова sumTo(5-1) bla 2 // выполнится от 5 после проверки условия n==3, но до вызова sumTo(5-1) bla 1 // 1й вызов. (вызовет ДВЕ sumTo(4)). выполнится от 4 еще до проверки условия n==3 bla 2 // 1й вызов. выполнится от 4 после проверки условия n==3 bla 1 // (sumTo(4-1) 2й вызов, вызывает ДВЕ sumTo(3), первая sumTo(3) не проходит проверку if n == 3 bla 1 // вторая sumTo(3) не проходит проверку if n == 3 bla 3 // от завершения первой посчитанной sumTo(4) bla 1 // до проверки условия, от запуска второй sumTo(4) bla 2 // после проверки условия, от запуская второй sumTo(4) bla 1 // (sumTo(4-1) 2й вызов, вызывает ДВЕ sumTo(3), первая sumTo(3) не проходит проверку if n == 3 bla 1 // вторая sumTo(3) не проходит проверку if n == 3 bla 3 // от завершения первой посчитанной sumTo(4) bla 3 // от завершения sumTo(5) |
Цитата:
![]() Видим значения переменных, стек вызовов (можем по ним ходить) выполняем код по строчке. |
Цитата:
Вопросы: 1. Что именно Вы имели ввиду, под "это чтобы показать что глобальные переменные отслеживать неудобно и за них следует отрывать руки"? Разве у меня там, где-то, была глобальная переменная? 2. Зачем переменная g = 0 ? 3. Я правильно понимаю, что необходимо ставить точку останова и только после этого, будет доступна возможность выполнять в конкретном месте код пошагово? 4.
function sumTo(n)
{
console.log("bla 1 относится к " + n);
if (n == 1) return n;
console.log("bla 2 относится к " + n);
res=sumTo(n-1) + sumTo(n-1);
console.log("bla 3 относится к " + n);
return res;
}
document.write( sumTo(2) );
Начинаю прокручивать в инструментах разработчика в google chrome:
console.log("bla 1 относится к " + n);
if (n == 1) return n;
console.log("bla 2 относится к " + n);
res=sumTo(n-1) + sumTo(n-1);
далее
console.log("bla 1 относится к " + n);
if (n == 1) return n; (ДВА РАЗА)
затем одна из рекурсий завершает свое выполнение и получается вторая единица
console.log("bla 1 относится к " + n);
if (n == 1) return n; (ДВА РАЗА)
затем рекурсия прекращает свою работу НО! когда щелкаю на next function call он еще "перескакивает" на строчку res=sumTo(n-1) + sumTo(n-1); и только потом доходит до bla 3. это завершает свое выполнение основной вызов первый, но почему он переходит на эту строчку ( res=sumTo(n-1) + sumTo(n-1);) ничего не делая? ведь он должен был ее "пройти" когда инициализировал вызов рекурсий. 5. Я правильно понимаю, что даже если бы функция на была вызвана в теле документа (document.write( sumTo(2) );), она все равно бы посчиталась (использовала бы память)? |
Цитата:
Цитата:
Цитата:
Цитата:
-------- Цитата:
-------- Цитата:
-------- Цитата:
|
| Часовой пояс GMT +3, время: 21:30. |