Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.03.2013, 23:08
Аватар для helpmepls
Интересующийся
Отправить личное сообщение для helpmepls Посмотреть профиль Найти все сообщения от helpmepls
 
Регистрация: 01.03.2013
Сообщений: 12

Логика вывода сообщений в 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
Ответить с цитированием
  #2 (permalink)  
Старый 01.03.2013, 23:44
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

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 // откуда?
Второй уровень вложенности, второй вызов

Думаю, дальше понятно
Ответить с цитированием
  #3 (permalink)  
Старый 02.03.2013, 03:07
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

helpmepls, выполняй код пошагово.
Ответить с цитированием
  #4 (permalink)  
Старый 02.03.2013, 10:30
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Или так:
console.log("bla 1, n="+n);
Ответить с цитированием
  #5 (permalink)  
Старый 09.03.2013, 19:17
Аватар для helpmepls
Интересующийся
Отправить личное сообщение для helpmepls Посмотреть профиль Найти все сообщения от helpmepls
 
Регистрация: 01.03.2013
Сообщений: 12

вроде понял?
Сообщение от danik.js Посмотреть сообщение
helpmepls, выполняй код пошагово.
Правильно ли я понял, что пошагово это вот так:

Код:
function sumTo(n) 

  {
console.log("bla 1 относится к " + n);
  if (n == 3) return n;
console.log("bla 2 относится к " + n);
res=sumTo(n-1) + sumTo(n-1); 
console.log("bla 3 относится к " + n);
return res;
    }

alert( sumTo(5) );
rgl, так все верно понял?

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)
Ответить с цитированием
  #6 (permalink)  
Старый 09.03.2013, 20:02
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от helpmepls
Правильно ли я понял, что пошагово это вот так:
Пошагово, это вот так:

Видим значения переменных, стек вызовов (можем по ним ходить) выполняем код по строчке.
Ответить с цитированием
  #7 (permalink)  
Старый 25.03.2013, 23:14
Аватар для helpmepls
Интересующийся
Отправить личное сообщение для helpmepls Посмотреть профиль Найти все сообщения от helpmepls
 
Регистрация: 01.03.2013
Сообщений: 12

Сообщение от danik.js Посмотреть сообщение
Пошагово, это вот так:

Видим значения переменных, стек вызовов (можем по ним ходить) выполняем код по строчке.
Благодарю за ответ.

Вопросы:

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) ), она все равно бы посчиталась (использовала бы память)?
Ответить с цитированием
  #8 (permalink)  
Старый 26.03.2013, 12:23
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от helpmepls
Разве у меня там, где-то, была глобальная переменная?
Сообщение от helpmepls
07: res=...
--------
Сообщение от helpmepls
Зачем переменная g = 0 ?
Сообщение от danik.js
это чтобы показать что глобальные переменные отслеживать неудобно и за них следует отрывать руки
Смотри на скрин. В списке переменных ты видишь g? Ее там нет. Все глобальные переменные нужно отыскивать в window, а там сотни свойств.
--------
Сообщение от helpmepls
3. Я правильно понимаю, что необходимо ставить точку останова и только после этого, будет доступна возможность выполнять в конкретном месте код пошагово?
Можно еще включить остановку при возникновении ошибки.
--------
Сообщение от helpmepls
4.
На панели несколько кнопочек. Почитай всплывающие подсказки
--------
Сообщение от helpmepls
если бы функция на была вызвана в теле документа (document.write( sumTo(2) ), она все равно бы посчиталась (использовала бы память)?
Нет, она бы использовала пространство нашей галактики для своего размещения.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обновление не существующих сообщений ajax tayler882 AJAX и COMET 2 28.11.2012 17:13
hide сообщений на форуме fAmOus Элементы интерфейса 2 07.09.2012 15:05
Обертка на console.log German Malinovskiy Общие вопросы Javascript 8 14.08.2012 17:58
Логика звукового уведомления о поступлении новых сообщений Триви AJAX и COMET 1 11.08.2011 02:13
Авто "объединение" последних сообщений ksa Сайт Javascript.ru 0 19.11.2010 11:58