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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2017, 20:20   #1
gryllus
Пользователь
 
Регистрация: 27.08.2017
Сообщений: 99
Злость [РЕШЕНО] Рекурсивная функция. Помогите понять

Вторые сутки мозг ломаю. Говорят:"Надо отдохнуть и на свежую голову всё встанет на свои места". Не встало...ещё хуже стало понимание.
Вод код.

Код:
const sequenceSum = (begin, end) => {
   if (begin === end){
   return begin;
 } else if (begin > end){
   return NaN;
 } else{ 
  begin + sequenceSum(begin + 1, end);
  }
};

sequenceSum(1, 5);
Понимаю, что происходит углубление в функцию с единицы до пяти, а далее идёт пошаговое сложение итог: 15. Один шаг одно сложение...
Но, что происходит в каждой строчке сначала вроде понимал, а на данный момент вообще выпал.

Функции sequenceSum присвоили аргументы begin - 1, end - 5. Взяли эти аргументы и спустились к телу функции, в частности к if где происходит сравнение типов и значений где оно undefined. Опускается к следующему условию где если begin больше end то оно будет NaN, оно тоже undefined, что в следующей строке и далее до конца происходит мне уже непонятно... Понятно, что тоже самое будет происходить с каждой цифрой по порядку до 5. Далее подъём наружу и всё... Мозг здесь снова виснет.
Пожалуйста помогите. Разложите мне всё по порядку на понятном языке для начинающего который кроме html и css ни чего не нюхал...
Очень надо понять... Заранее благодарен.
С Наилучшими пожеланиями!
gryllus вне форума Ответить с цитированием
Старый 22.09.2017, 20:46   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Это ваш код или пример? Вроде ж он не работает (не возвращает результат). В последнем else что-то странное, наверно return пропущен.

Код:
return begin + sequenceSum(begin + 1, end);
А что именно непонятно?
Первый if — условие завершения рекурсии.
Второй — видимо на случай неправильных входных данных (5 и 1).
А если ни один из них не "сработал", то вернет begin + сумма от begin+1 до конца.

Может быть будет понятнее если заметить, что sequenceSum(5, 5) вернет 5 (сразу первый if и все), а sequenceSum(4, 5) вернет 4 + sequenceSum(5, 5)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 02.10.2017 в 17:19.
Alex11223 вне форума Ответить с цитированием
Старый 22.09.2017, 21:47   #3
gryllus
Пользователь
 
Регистрация: 27.08.2017
Сообщений: 99
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Это ваш код или пример? Вроде ж он не работает (не возвращает результат). В последнем else что-то странное, наверно return пропущен.

Код:
return begin + sequenceSum(begin + 1, end);
А что именно непонятно?
Первый if — условие завершения рекурсии.
Второй — видимо на случай неправильных входных данных (5 и 1).
А если ни один из них не "сработал", то вернет begin + сумма от begin+1 до конца.

Может быть будет понятнее если заметить, что sequenceSum(5, 5) вернет 5 (сразу первый if и все), а sequenceSum(4, 5) вернет 4 + sequenceSum(5, 5)
Да, всё верно return в последнем else забыл

Код:
const sequenceSum = (begin, end) => {
   if (begin === end){
   return begin;
 } else if (begin > end){
   return NaN;
 } else{ 
  return begin + sequenceSum(begin + 1, end);
  }
};

sequenceSum(1, 5);
Это задача на Хекслете с такими вот условиями:

sequenceSum(1, 5); // 1 + 2 + 3 + 4 + 5 = 15
sequenceSum(4, 10); // 4 + 5 + 6 + 7 + 8 + 9 + 10 = 49
sequenceSum(-3, 2); // (-3) + (-2) + (-1) + 0 + 1 + 2 = -3
Соответственно известным было
Код:
const sequenceSum = (begin, end) =>
и то, что выше.
Я вроде реализовал её самостоятельно на каком-то интуитивном уровне, но мне хочется понять, что происходит в последнем else (какой порядок вычислений, ну ни чего у меня не сходится)... Понятно, что на поверхности мы видим только последний return. Когда у нас begin и end будут равны пяти. И для чего нужен последний else if (его я подглядел в вопросах и ответах) он ведь в этом коде вроде ни когда не реализуется.

Если очевидно, что цели не достижимы - корректируйте не цели, корректируйте действия.
Конфуций.
gryllus вне форума Ответить с цитированием
Старый 22.09.2017, 21:55   #4
Вадим Мошев

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

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
В последнем else что-то странное, наверно return пропущен.
Я вот тоже думаю, что return пропущен.

gryllus, вообще, если в if используется инструкция return, то else писать незачем - это ненужные код. В таких случаях надо просто завершить условный оператор, а далее писать тот же код, который ранее был записан в ветке else.

Также, обратите внимание, что, стрелочные функции автоматически возвращают значение только том случае, если её инструкции не заключены в фигурные скобки. Если вы заключаете тело функции в фигурные скобки, и хотите, чтобы она возвращала значение, то используйте инструкцию return.

С учётом всего этого, я переписал бы ваш код так
Код:
const sequenceSum = (begin, end) => {
   if (begin === end){
    return begin;
   };

   return (begin > end) ? NaN : begin + sequenceSum(begin + 1, end);
};

Последний раз редактировалось Вадим Мошев; 22.09.2017 в 21:58.
Вадим Мошев вне форума Ответить с цитированием
Старый 22.09.2017, 21:57   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от gryllus Посмотреть сообщение
И для чего нужен последний else if (его я подглядел в вопросах и ответах) он ведь в этом коде вроде ни когда не реализуется.
Я ж сказал, видимо на случай непредусмотренных входных данных.
Может быть там автоматические тесты есть на это. (их там можно посмотреть в одном из доступных в среде файлов)
Цитата:
Сообщение от gryllus Посмотреть сообщение
е, но мне хочется понять, что происходит в последнем else (какой порядок вычислений, ну ни чего у меня не сходится)
Так я ж говорю, подумайте сначала что происходит при вызове sequenceSum(5, 5), потом при sequenceSum(4, 5), и должно стать понятно )
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 22.09.2017, 22:15   #6
gryllus
Пользователь
 
Регистрация: 27.08.2017
Сообщений: 99
По умолчанию

Цитата:
Сообщение от Вадим Мошев Посмотреть сообщение
Я вот тоже думаю, что return пропущен.

gryllus, вообще, если в if используется инструкция return, то else писать незачем - это ненужные код. В таких случаях надо просто завершить условный оператор, а далее писать тот же код, который ранее был записан в ветке else.

Также, обратите внимание, что, стрелочные функции автоматически возвращают значение только том случае, если её инструкции не заключены в фигурные скобки. Если вы заключаете тело функции в фигурные скобки, и хотите, чтобы она возвращала значение, то используйте инструкцию return.

С учётом всего этого, я переписал бы ваш код так
Код:
const sequenceSum = (begin, end) => {
   if (begin === end){
    return begin;
   };

   return (begin > end) ? NaN : begin + sequenceSum(begin + 1, end);
};
Код:
const sequenceSum = (begin, end) => {
   if (begin === end){
    return begin;
   };

   return (begin > end) ? NaN : begin + sequenceSum(begin + 1, end);
};
Всё верно вы использовали тернарный оператор (п омоему так он называется ещё не всё запоминается), чем сократили код.

Цитата:
Сообщение от gryllus Посмотреть сообщение
а sequenceSum(4, 5) вернет 4 + sequenceSum(5, 5)
...а sequenceSum(3, 5) вернёт 3 + sequenceSum(4, 5) - здесь вроде всё ясно. Сумма-то вычислится(или + это не сумма, а унарный оператор или ещё, что нибудь чего я пока не знаю) или нет вот что не понятно - будет какое-то значение?

Цитата:
Сообщение от gryllus Посмотреть сообщение
...а sequenceSum(3, 5) вернёт 3 + sequenceSum(4, 5) - здесь вроде всё ясно. Сумма-то вычислится(или + это не сумма, а унарный оператор или ещё, что нибудь чего я пока не знаю) или нет вот что не понятно - будет какое-то значение?
sequenceSum(3, 5) вернёт 3 + sequenceSum(3 + 1, 5) => вернёт 3 + sequenceSum(4 , 5)

Последний раз редактировалось Вадим Мошев; 22.09.2017 в 22:33.
gryllus вне форума Ответить с цитированием
Старый 22.09.2017, 22:31   #7
Вадим Мошев

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

Цитата:
Сообщение от gryllus Посмотреть сообщение
по-моему так он называется ещё не всё запоминается
Да, он называется так. Ещё встречал такое определение - "Арифметический условный оператор"

gryllus, используйте кнопку "Правка", чтобы дополнить своё последнее сообщение (если новых не ваших нет), а не дописывайте новые.
Вадим Мошев вне форума Ответить с цитированием
Старый 22.09.2017, 22:42   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от gryllus Посмотреть сообщение
или + это не сумма
сумма

Цитата:
Сообщение от gryllus Посмотреть сообщение
или нет вот что не понятно - будет какое-то значение?
непонятно что? Будет begin + то, что вернет тот вызов sequenceSum. (вычисляется сначала оно, а потом сумма, то есть просто сумма двух чисел)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 22.09.2017, 22:43   #9
gryllus
Пользователь
 
Регистрация: 27.08.2017
Сообщений: 99
По умолчанию

Код:
const sequenceSum = (begin, end) => {
   if (begin === end){
   return begin;
 } else if (begin > end){
   return NaN;
 } else{ 
  return begin + sequenceSum(begin + 1, end);
  }
};

sequenceSum(1, 5);
И всё таки какую роль сыграл
Код:
else if (begin > end){
   return NaN;
чему else if не дал реализоваться и как правильно прочитать условие... И тогда всё встанет на свои места.
gryllus вне форума Ответить с цитированием
Старый 22.09.2017, 22:49   #10
gryllus
Пользователь
 
Регистрация: 27.08.2017
Сообщений: 99
По умолчанию

Вот теперь всё понятно... Десять тысяч вам СПАСИБО!!!

чему else if не дал реализоваться
Код:
else if (begin > end){
   return NaN;
и как правильно прочитать условие... И тогда всё встанет на свои места.

Последний раз редактировалось gryllus; 22.09.2017 в 22:52.
gryllus вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ Рекурсивная функция Krab_npopok Помощь студентам 9 26.12.2013 23:45
Рекурсивная функция --1990Артём Помощь студентам 1 09.12.2012 10:21
Рекурсивная функция C++ Buryy_Mishka Помощь студентам 0 31.05.2010 00:27
Рекурсивная функция Skinnyman Помощь студентам 4 16.03.2010 18:05