Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите разобраться с рекурсией (https://javascript.ru/forum/misc/28694-pomogite-razobratsya-s-rekursiejj.html)

noname1990 30.05.2012 07:20

Помогите разобраться с рекурсией
 
объясните пж-та как тут отрпабатывает скрипт
function func ( sun )
		{ 
				
				if (sun > 0 )
				{ 
						
						console.log(sun)
						func ( sun - 1 );
						console.log( sun + 'a');
				}
				
		}
		func(3)

Почему выводит 321, а потом 1a2a3a??

GuardCat 30.05.2012 10:47

Трудно объяснять рекурсию. Попробую написать пошаговый сценарий, того, что происходит после вызова функции. Отступами показывается уровень погружения рекурсии. Итак, вызвали функцию и поехали (следите и по коду в том числе):

Код:

1. Записать в консоль 3.
2. Вызвать func( 2 )
  2.1 Записать в консоль 2.
  2.2 Вызвать func( 1 ).
    2.2.1 Записать в консоль 1.
    2.2.2 Вызвать func( 0 ).
      2.2.2.1 закончить выполнение функции
    2.2.3 Записать в консоль 1a
    2.2.4 Закончить выполнение функции
  2.3. Записать в консоль 2a
  2.4 Закончить выполнение функции
3. Записать в консоль 3a
4. Закончить выполнение функции


noname1990 30.05.2012 11:19

Спасибо, тока не понятно почему он начинает с 1а...он как-то снижу вверх поднимается по стеку? или я что-т не так понял?

Gvozd 30.05.2012 11:26

http://clck.ru/d/p1NR4ASA19Zlb
Я нарисовал для вас питонов
Двигаемся слева направо, входя во внутрь питонов

1. Для начала мы попадаем в рот первого питона. Мы находимся в его голове(head)
2. Идем дальше вглубь внутренностей тела, и обнаруживаем что в его теле содержится другой питон
3. Заходим внутрь второго питона. Сейчас мы находимся внутри головы(head) второго питона
4. Идем дальше вглубь внутренностей тела, и обнаруживаем что в теле второго питона, также содержится другой питон.
5. Заходим внутрь третьего питона. Сейчас мы находимся внутри головы(head) третьего питона
6. Идем дальше вглубь внутренностей тела, и обнаруживаем что в теле третьего питона ничего не содержится.
7. Быстро миновав пустое тело третьего питона мы оказываемся в его хвосте(tail)
8. Выйдя из третьего питона мы оказываемся в хвосте(tail) второго питона
9. Выйдя из второго питона мы оказываемся в хвосте(tail) первого питона
9. Выйдя из первого питона мы оказываемся снаружи. Работа завершена

То есть наш маршрут выглядит как
голова1 - голова2- голова3 - хвост 3 - хвост2 - хвост1
Так даже похоже на вашу строку "3 2 1 1a 2a 3a"

noname1990,
В вашем коде с 4-й по 7-ю строки - это голова питона
8-я строка - это его кишки содержащие следующего питона
9-я строка - хвост питона.


Ну как-то так в общем.
Всем питона, пацаны!)

GuardCat 30.05.2012 11:31

Gvozd, это феерично! Действительно, так может оказаться понятнее (=

Понять рекурсию, это как проползти через кишки питона =) Почти романтика!

noname1990, и опять же, глядя на мой список: чем дальше отступ тем глубже вы находитесь внутри питона. Нет отступа — вы внутри одного питона, один отступ: вы попали ещё в одного питона внутри первого и т.д.

Функция, вызывая свою копию, ждёт, пока та закончит работу и только после этого продолжает выполнять свои инструкции дальше.

noname1990 30.05.2012 11:47

Питоны просто шедевральные!))))
Всем спасибо, теперь вроде все догнал))


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