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

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

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2018, 14:06   #1
ЯиТы
Новичок
Джуниор
 
Регистрация: 14.07.2018
Сообщений: 1
Лампочка Помогите разобраться как работает рекурсия.

Есть такой код, который которая для данного n вычисляет сумму чисел от 1 до n.
Код:
       var n = +prompt("n?", "");
       function sumTo(n) {
            if (n > 1) {
               return n + sumTo(n - 1);
            } else {
               return 1;
            }
      }
      alert( sumTo(n) );
По сути, программа работает правильно, но когда я считаю сам, получается другое число. Например, n = 4.
sumTo(4) = 4 + sumTo(3); // 4 + 9 = 13;
sumTo(3) = 4 + sumTo(2); // 4 + 5 = 9;
sumTo(2) = 4 + sumTo(1); // 4 + 1= 5
sumTo(1) = 1;
и в итоге должно получиться 13, но программа считает как 10. Где ошибка?
Может должно быть так?
sumTo(4) = 4 + sumTo(3); // 4 + 6 = 10;
sumTo(3) = 3 + sumTo(2); // 3 + 3 = 6;
sumTo(2) = 2 + sumTo(1); // 2 + 1= 3
sumTo(1) = 1;

Последний раз редактировалось ЯиТы; 14.07.2018 в 14:13.
ЯиТы вне форума Ответить с цитированием
Старый 14.07.2018, 14:22   #2
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

В рекурсии n не меняется, но в функции вызывается эта же функция с уменьшенным на единицу исходным аргументом.
Вот, например, n = 4. Должно получиться 1+2+3+4 = 10.
Как работает в данном случае рекурсия. Функция возвращает сумму своего аргумента и значения этой функции, взятой от этого же аргумента, но уменьшенного на 1, либо 1, если аргумент изначально равен 1. имеем:

sumTo(4) = 4 + sumTo(3) (*)

sumTo(3) = 3 + sumTo(2)

sumTo(2) = 2 + sumTo(1)

sumTo(1) = 1.

Теперь, пользуясь тем, что мы знаем, чему равно sumTo(n) для n = 1..4, подставляем известные значения в строку (*), в итоге получаем sumTo(4) = 4 + 3 + 2 + 1 = 10.

Кстати, если у вас в условном операторе используется return, то ветка else для него нужна. Кроме того, всё это условие можно заменить на тернарный оператор, в итоге функция sumTo() будет иметь вид

Код:
function sumTo(n) {
 return (n > 1) ? n + sumTo(n-1) : 1;
}
;

Последний раз редактировалось Вадим Мошев; 14.07.2018 в 14:25.
Вадим Мошев вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться - не работает файл со скриптом. При загрузке из консоли этот же скрипт работает Kazik JavaScript, Ajax 6 27.11.2015 16:09
Программма работает, но не так как мне нужно. Помогите разобраться. shewlett Помощь студентам 1 30.03.2015 17:25
Рекурсия в Паскале, помогите разобраться Василий_0110 Помощь студентам 1 18.03.2014 19:26
Не пойму как работает рекурсия googl Общие вопросы Delphi 18 15.12.2011 20:30
Помогите разобраться как это работает! Пожалуйста Romens Паскаль, Turbo Pascal, PascalABC.NET 1 08.12.2008 22:16