Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.05.2012, 03:55
Новичок на форуме
Отправить личное сообщение для S.D.Maquis Посмотреть профиль Найти все сообщения от S.D.Maquis
 
Регистрация: 23.10.2011
Сообщений: 9

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 передаёт значение, где хранятся значения когда функция запущена.

Последний раз редактировалось S.D.Maquis, 06.05.2012 в 04:06.
Ответить с цитированием
  #2 (permalink)  
Старый 06.05.2012, 04:10
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

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

А во-вторых все верно, каждый вызов функции sumTo относится к предыдущему контексту, то есть образуется длинный ряд замыканий. В конце концов, когда рекурсия прерывается, попадая под условие выхода, все полученные ранее результаты выполнений всех итераций складываются.
Ответить с цитированием
  #3 (permalink)  
Старый 06.05.2012, 05:17
Новичок на форуме
Отправить личное сообщение для S.D.Maquis Посмотреть профиль Найти все сообщения от S.D.Maquis
 
Регистрация: 23.10.2011
Сообщений: 9

DreamTheater
Спасибо!
Если у вас найдётся ссылочка по сабжу(мб в учебнике есть, я его весь не читал) буду очень рад! Просто хочется ещё более глубоко понимать данный вопрос, для созданий собственных функций такого типа.
для меня просто это новая информация: все полученные ранее результаты выполнений всех итераций складываются.
Ответить с цитированием
  #4 (permalink)  
Старый 06.05.2012, 10:14
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

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

Сообщение от S.D.Maquis
Если у вас найдётся ссылочка по сабжу
Рекурсия — фундаментальное понятие в программировании. Тысячи статей в сети есть о ней.

Сообщение от S.D.Maquis
Не могли бы вы объяснить как идёт процесс рекурсии пошагово, то есть всё подробно, куда retun передаёт значение, где хранятся значения когда функция запущена.
sum(3) = 3 + sum(2) = 3 + 2 + sum(1) = 3 + 2 + 1 = 6
Ответить с цитированием
  #5 (permalink)  
Старый 06.05.2012, 15:45
Новичок на форуме
Отправить личное сообщение для S.D.Maquis Посмотреть профиль Найти все сообщения от S.D.Maquis
 
Регистрация: 23.10.2011
Сообщений: 9

Сообщение от B@rmaley.e><e Посмотреть сообщение
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 )

Спасибо всем за помощь всё сало намного яснее !
Ответить с цитированием
  #6 (permalink)  
Старый 06.05.2012, 15:50
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

Сообщение от B@rmaley.e><e Посмотреть сообщение
Ряд чего-чего? Замыкания — это из другой оперы.
Тут же для каждого вызова создается новый кадр на стеке.
Да, верно, я неправильно выразился.
Ответить с цитированием
  #7 (permalink)  
Старый 06.05.2012, 15:54
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,493

Про один return на функцию это вы явно загнули.
__________________
29375, 35
Ответить с цитированием
  #8 (permalink)  
Старый 06.05.2012, 15:56
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

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

function inc() {
	return ++num;
}

alert( inc() + inc() + inc() );
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #9 (permalink)  
Старый 06.05.2012, 16:04
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от S.D.Maquis Посмотреть сообщение
Читал про рекурсию
я больше скажу, в примере кода дана хвостовая рекурсия.

nerv_, не понял
Ответить с цитированием
  #10 (permalink)  
Старый 06.05.2012, 16:14
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

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



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книга: JavaScript. Сильные стороны Magneto Учебные материалы 16 21.04.2013 15:28
Первый Moscow JavaScript Meetup korenyushkin Общие вопросы Javascript 0 26.07.2011 15:23
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34
JavaScript на Яндекс.Фотки - почему тормозит браузеры? ZavFirefox Javascript под браузер 23 27.09.2009 19:24