Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   JavaScript Рекурсия (https://javascript.ru/forum/misc/28055-javascript-rekursiya.html)

S.D.Maquis 06.05.2012 03:55

JavaScript Рекурсия
 
Всем Доброго времени суток !

Только недавно начал изучать ЯваСкрипт.
Читал про рекурсию

Вот пример:

function sumTo(n) {
  if (n == 1) return 1;
  return n + sumTo(n-1);
}
alert( sumTo(100) ); //5050


ретурн ведь возвращает значение обратно той функции которую вызывали, так почему когда функция доходит до значения 1 и она видит условие if:
if (n == 1) return 1;
она ведь должна возвратить 1 как написано по условию и тогда sumTo(100) будит равен 1 а не 5050.

Приведу пример:
function sumTo(n) {
	 return 1;
	}
alert( sumTo(4) );

Результат: 1
и не имеет значение какое число было в sumTo(число)


Не могли бы вы объяснить как идёт процесс рекурсии пошагово, то есть всё подробно, куда retun передаёт значение, где хранятся значения когда функция запущена.

DreamTheater 06.05.2012 04:10

Ну во-первых писать в пределах функции более одного return это по меньшей мере признак дурного тона. Из-за этого возникает путаница.

А во-вторых все верно, каждый вызов функции sumTo относится к предыдущему контексту, то есть образуется длинный ряд замыканий. В конце концов, когда рекурсия прерывается, попадая под условие выхода, все полученные ранее результаты выполнений всех итераций складываются.

S.D.Maquis 06.05.2012 05:17

DreamTheater
Спасибо!
Если у вас найдётся ссылочка по сабжу(мб в учебнике есть, я его весь не читал) буду очень рад! Просто хочется ещё более глубоко понимать данный вопрос, для созданий собственных функций такого типа.
для меня просто это новая информация: все полученные ранее результаты выполнений всех итераций складываются.

B@rmaley.e><e 06.05.2012 10:14

Цитата:

Сообщение от DreamTheater
образуется длинный ряд замыканий

Ряд чего-чего? Замыкания — это из другой оперы.
Тут же для каждого вызова создается новый кадр на стеке.

Цитата:

Сообщение от S.D.Maquis
Если у вас найдётся ссылочка по сабжу

Рекурсия — фундаментальное понятие в программировании. Тысячи статей в сети есть о ней.

Цитата:

Сообщение от S.D.Maquis
Не могли бы вы объяснить как идёт процесс рекурсии пошагово, то есть всё подробно, куда retun передаёт значение, где хранятся значения когда функция запущена.

sum(3) = 3 + sum(2) = 3 + 2 + sum(1) = 3 + 2 + 1 = 6

S.D.Maquis 06.05.2012 15:45

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 172927)
sum(3) = 3 + sum(2) = 3 + 2 + sum(1) = 3 + 2 + 1 = 6

когда функция достигает sum(1) она попадает в if и прибавляет 1(ведь по условию if (n == 1) return 1; и если напр. изменить на return 3 то будит уже 3 прибавлять и результат выйдет 8 )

Спасибо всем за помощь всё сало намного яснее !

DreamTheater 06.05.2012 15:50

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 172927)
Ряд чего-чего? Замыкания — это из другой оперы.
Тут же для каждого вызова создается новый кадр на стеке.

Да, верно, я неправильно выразился.

Aetae 06.05.2012 15:54

Про один return на функцию это вы явно загнули.

nerv_ 06.05.2012 15:56

немножко не из той оперы пример, но пусть будет
var num = 0;

function inc() {
	return ++num;
}

alert( inc() + inc() + inc() );

melky 06.05.2012 16:04

Цитата:

Сообщение от S.D.Maquis (Сообщение 172915)
Читал про рекурсию

я больше скажу, в примере кода дана хвостовая рекурсия.

nerv_, не понял

B@rmaley.e><e 06.05.2012 16:14

Цитата:

Сообщение от melky
я больше скажу, в примере кода дана хвостовая рекурсия.

Сами-то статью читали?


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