Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.02.2013, 19:12   #1
zlo_999
Форумчанин
 
Аватар для zlo_999
 
Регистрация: 11.10.2010
Сообщений: 116
Вопрос javascript (логика вывода сообщений в console.log)

PHP код:
<script>

function 
sumTo(n
{

console.log("bla 1");
if (
== 3) return n
console.log("bla 2");
res=sumTo(n-1) + sumTo(n-1);
console.log("bla 3");
return 
res;

}

alertsumTo(5) );

</script> 
Не получается логически понять вывод в консоль некоторых моментов, а именно:


bla 1 // выполнится еще до проверки условия n==3 и до вызова sumTo(n-1)

bla 2 // выполнится после проверки условия n==3, но до вызова sumTo(n-1)

bla 1 // 1й вызов. выполнится благодаря вложенному вызову функции SumTo(n-1) (5-1 = 4)

bla 2 // выполнится когда же и предыдущий поскольку счет пошел дальше после проверки условия

bla 1 // 2й вызов (4-1 = 3) счет дальше не пошел запоролся условием

bla 1 // ?

bla 3 // ?

bla 1

bla 2

bla 1

bla 1

bla 3

bla 3
zlo_999 вне форума Ответить с цитированием
Старый 01.03.2013, 23:05   #2
zlo_999
Форумчанин
 
Аватар для zlo_999
 
Регистрация: 11.10.2010
Сообщений: 116
По умолчанию

Никто не знает?
zlo_999 вне форума Ответить с цитированием
Старый 01.03.2013, 23:37   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну да, вечером пятницы все тут на форуме и сидят...

на месте вашего затыка
ну, первая 4-ка уменьшается на 1 и ваша рекурсия ещё раз срабатывает..
потом, со вторым вызовом тоже самое..

посмотрите, я набросал аналогичную программку на Паскале (какая разница, какой язык программирования, ведь Вам суть рекурсии понять надо, а у меня есть Delphi под рукой...)
вывод ваш расширил (вывожу n и строку, переданную как параметер.

получилось такое:
Код:
bla 1 for n=5 s=root entry
bla 2 for n=5 s=root entry
bla 1 for n=4 s=first_adding
bla 2 for n=4 s=first_adding
bla 1 for n=3 s=first_adding
bla 1 for n=3 s=second_adding
bla 3 for n=4 first_adding
bla 1 for n=4 s=second_adding
bla 2 for n=4 s=second_adding
bla 1 for n=3 s=first_adding
bla 1 for n=3 s=second_adding
bla 3 for n=4 second_adding
bla 3 for n=5 root entry


если, что, программка такая:
Код:
function sumTo(n: integer; const s : string) : integer;
begin
  WriteLn('bla 1 for n=',n,' s=',s);
  if (n = 3) then begin result := n; exit end;
  WriteLn('bla 2 for n=',n,' s=',s);
  result := sumTo(n-1,'first_adding') + sumTo(n-1,'second_adding');
  WriteLn('bla 3 for n=',n,' ',s);
end;

var k : integer;
begin
  sumTo(5,'root entry');
  Readln
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.03.2013, 23:18   #4
zlo_999
Форумчанин
 
Аватар для zlo_999
 
Регистрация: 11.10.2010
Сообщений: 116
По умолчанию

Serge_Bliznykov, благодарю за ответ.

Вот так я все верно понял?

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)
zlo_999 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Триггеры. Создание окошек для вывода сообщений об ошибке. Vladimir-888 БД в Delphi 1 27.01.2012 04:35
запрет вывода системных сообщений Alex586 Microsoft Office Access 5 09.11.2011 00:37
try-except Диалоговые окна ввода/вывода сообщений Типизированные файлы Ko$ Помощь студентам 5 16.03.2011 12:26
JavaScript поля ввода/вывода Doublefaced Помощь студентам 2 03.06.2009 01:36
убирание автоматического вывода сообщений об ошибке Juffin Общие вопросы Delphi 2 06.04.2009 12:41