Вопрос №3024 от пользователя Алексей Владимирович в уроке «Итеративный процесс», курс «Основы программирования»

Алексей Владимирович

Не понимаю, почему Функция iter раз за разом работает, там ведь нет цикла и параметр (acc) вполне конкретный и рекурсии в формуле нет...

20 0

Kirill Mokevnin

Есть рекурсия. iter вызывается внутри iter.

0

Алексей Владимирович

Когда один раз вызывает - понятно. Произошло вычисление и вроде всё, не должно ещё раз себя вызывать, ведь функция от конкретного числа...

2

Алексей Владимирович

Или оно до тех пор вызывается, пока одно из терминальных условий не выполнится?

0

Kirill Mokevnin

Лучший способ разобраться это прямо на листочке писать последовательность действий. Вы увидите наглядно в каком слуачае оно продолжает вызываться, а в каком остановится.

0

Алексей Владимирович

Я так и делаю. Я с 0 начинаю в этом разбираться. Но в циклах мне очевиднее каждая итерация, а в рекурсии нет ; ( Когда аргумент конечен тем более кажется, что итерация всего одна должна быть; (

1

Kirill Mokevnin

А это ведь не зависит от аргументов, главное доходит ли внутри функции до вызова самой себя, если доходит то вот и рекурсия.

0

Алексей Владимирович

Тогда почему вообще останавливается?

0

Kirill Mokevnin

В любом процессе есть терминальная ветка, как только на нее попадает, то и останавливается. Естественно это ваша ответственность запрограммировать правильно эту терминальную ветку.

0

Kirill Mokevnin

В видео есть слайд где последовательно показаны вызовы и то какие параметры приходят во внутрь. По ним можно понять в какой момент выполнится терминальная ветка.

0

Алексей Владимирович

А почему не написали acc = 2; Над функцией iter? так как-то понятнее было б.

0

Kirill Mokevnin

Там и так достаточно понятно, функция $iter принимает на вход один параметр, который называется $acc. Остальное это уже вопрос практики.

0

Алексей Владимирович

Ничего не понятно. Просматриваешь до конца программу и только там видишь что-то конкретное, с чего может начать хотя бы работать программа.

0

Kirill Mokevnin

Ага, в вашем предложении зарыта сложность, которая вам мешает хорошо понимать код. Она заключается в том, что вы пока не четко себе представляете что такое "определение" и что такое "выполнение", вот это нужно оттачивать и учиться читать программы быстро и поверхностно, чтобы находить точки входа, и понимать порядок работы.

0

Алексей Владимирович

Про точки входа вы не рассказывали вроде. Так слышал мимолётом. Интуитивно понятно о чём это. Но может там оказаться целый пласт, как за numspace?

0

Алексей Сыщенко

Все довольно просто. Определена функция factorial, внутри ее определена функция iter. Наша программа начинает работать здесь с вызова функции factorial(что-то там). Что должен делать factorial? Все что он делает, это возвращает iter(...). Вот тут и начинает выполняться iter. Делает она это рекурсивно, так как возвращает вызов себя самой складывая результат произведения в переменную. Когда достигли терминального условия просто возвращаем то, что накопилось в переменной. Главное видеть эти точки входа и понимать, что само по себе определение не выполняется.

0

Алексей Владимирович

Ну, в данном конкретном примере, всё начинает работать только с return iter(2); А это последняя строчка в упражнении...

0

Kirill Mokevnin

Начинает работать раньше, просто не путайте определение и вызов, это ключ.

0

Алексей Владимирович

Если б не было этой строчки, то ничего бы не работало.

0

Алексей Сыщенко

"Если б не было этой строчки, то ничего бы не работало." Тут так можно сказать про многие строчки. Но если бы не было вызова factorial(0), например, тогда ничего бы и не начало выполняться. Если до сих пор непонятно - напишите это все на листочке, желательно с большими межстрочными интервалами и проследите выполнение. Можно записать ниже в столбик весь ход выполнения, кратко или как вам удобно, можно попробовать рисовать стрелочки от выражения к выражению и ставить цифры - этапы выполнения. Если пользуйтесь какой-то IDE, то наверняка там есть средства отладки и можно выполнить трассировку- выполнить программу по шагам и наглядно посмотреть откуда куда прыгает и как изменяются при этом переменные. Это все на самом деле не сложно, просто мозгу почему-то сложно привыкнуть, я сам сталкивался с этим, но после того как сделать написанное выше пару раз приходит понимание.

0

Алексей Владимирович

Алексей, а вы не могли бы дать скайп для связи или почту свою, если вам не трудно?

0

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Фронтенд-разработчик
Профессия
Разработка фронтенд-компонентов веб-приложений
25 мая 10 месяцев
Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
25 мая 10 месяцев
Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
25 мая 10 месяцев
Иконка программы Node.js-разработчик
Профессия
Разработка бэкенд-компонентов веб-приложений
25 мая 10 месяцев
Иконка программы Fullstack-разработчик
Профессия
Новый
Разработка фронтенд и бэкенд компонентов веб-приложений
25 мая 16 месяцев
Иконка программы Верстальщик
Профессия
Вёрстка с использованием последних стандартов CSS
в любое время 5 месяцев
Иконка программы Java-разработчик
Профессия
Разработка приложений на языке Java
25 мая 10 месяцев
Иконка программы Разработчик на Ruby on Rails
Профессия
Создает веб-приложения со скоростью света
25 мая 5 месяцев