Логика вывода сообщений в 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, время: 03:10. |