Рекурсивные функции. Часть 1
Часть раздела Логика и потоки выполнения путешествия по GDScript на Coddy. Урок 57 из 78.
Рекурсивная функция — это функция, которая вызывает саму себя. Каждый вызов решает меньшую версию задачи, пока задача не станет достаточно простой, чтобы решить её напрямую.
Эта функция складывает все целые числа от 1 до n:
func sum_to_n(n: int) -> int:
if n == 0: # базовый случай
return 0
return n + sum_to_n(n - 1) # рекурсивный шагОн состоит из двух частей:
- Базовый случай даёт ответ, не вызывая функцию снова: сумма до
0равна0. - Рекурсивный шаг вызывает функцию с меньшим значением,
n - 1, и строит ответ на основе результата.
sum_to_n(3) — это 3 + sum_to_n(2), то есть 3 + 2 + sum_to_n(1), то есть 3 + 2 + 1 + sum_to_n(0). Базовый случай возвращает 0, а ожидающие вызовы завершаются один за другим: результат — 6.
Каждый рекурсивный шаг должен приближать к базовому случаю. Без базового случая или при шаге вроде n + 1, который никогда его не достигает, функция продолжает вызывать саму себя. Godot допускает около 1 000 вложенных вызовов, а затем останавливает программу с ошибкой.
Задание
ЛегкоПрограмма считывает целое неотрицательное число n и вызывает count_down(n).
Ниже _ready() напиши рекурсивную функцию count_down с одним параметром. Она выводит каждое число от переданного аргумента до 0, по одному в строке. Не используй цикл: функция выводит своё число и вызывает себя с наименьшим следующим числом.
Для входных данных 3 результат будет таким:
3
2
1
0Попробуйте сами
extends Node
func _ready():
var n := int(OS.read_string_from_stdin())
count_down(n)
# Напишите ниже рекурсивную функцию count_down(n)
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и потоки выполнения
1Строки: углублённое изучение
Методы строкПоиск в строкахЗамена и обрезка пробеловРазделение и объединениеПовторение — проверка имени пользователя4Словари. Часть 2
Вложенные словариМассивы словарейОбъединение словарейКопирование словарейПовторение — подсчёт частоты10Продвинутые функции
Возврат нескольких значенийЛямбда-функции. Часть 1Лямбда-функции. Часть 2Повторение — сортировка с помощью лямбда-функцииРекурсивные функции. Часть 1Рекурсивные функции. Часть 2Повторение — сумма вложенного массива13Система управления запасами
Обзор проектаДобавление товара2Продвинутое управление ветвлением
Сопоставление с переменнымиУсловия в шаблонахШаблоны массивовШаблоны словарейПроверка принадлежностиИтоги — парсер команд5Приложение «Телефонная книга»
Показать менюДобавить контакт8Менеджер успеваемости студентов
Обзор проектаДобавить студента3Многомерные массивы
Основы двумерных массивовДоступ к элементам двумерного массиваВложенные циклы с двумерными массивамиПовторение: двумерные массивыРваные массивыТипичные шаблоны работы с двумерными массивамиПовторение: игровое поле6Множества и словари
Что такое множество?Словарь как множествоДобавление и удалениеОбъединение и пересечениеРазность множествПовторение — удаление дубликатовПотренируйтесь самостоятельно: Онлайн-компилятор GDScript