Почти каждая статья, которую я могу найти о рекурсии, включает примеры факторных чисел или чисел Фибоначчи, которые:
- математический
- Бесполезно в реальной жизни
Есть ли интересные примеры не математического кода для обучения рекурсии?
Я имею в виду алгоритмы «разделяй и властвуй», но они обычно включают сложные структуры данных.
Ответы:
Структуры каталогов / файлов - лучший пример использования для рекурсии, потому что все понимают их перед началом, но подойдет все, что связано с древовидными структурами.
источник
Ищите вещи, которые включают в себя древовидные структуры. Дерево относительно легко понять, и красота рекурсивного решения становится очевидной гораздо раньше, чем при использовании линейных структур данных, таких как списки.
Что нужно подумать:
Все они связаны с реальными сценариями реального мира, и все они могут использоваться в приложениях реального значения.
источник
https://stackoverflow.com/questions/105838/real-world-examples-of-recursion
https://stackoverflow.com/questions/2085834/how-did-you-practically-use-recursion
https://stackoverflow.com/questions/4945128/what-is-a-good-example-of-recursion-other-than-generating-a-fibonacci-sequence
https://stackoverflow.com/questions/126756/examples-of-recursive-functions
источник
Вот еще несколько практических проблем, которые приходят мне в голову:
источник
Быстрая сортировка будет первой, которая приходит на ум. Бинарный поиск также является рекурсивной проблемой. Кроме того, существуют целые классы проблем, решения которых выпадают практически бесплатно, когда вы начинаете работать с рекурсией.
источник
Сортировка, определенная рекурсивно в Python.
Слияние, определенное рекурсивно.
Линейный поиск, определенный рекурсивно.
Бинарный поиск, определенный рекурсивно.
источник
В некотором смысле, рекурсия - это все о решениях «разделяй и властвуй», то есть деление проблемного пространства на меньшее, чтобы помочь найти решение для простой задачи, а затем, как правило, возвращение к восстановлению исходной проблемы для составления правильного ответа.
Некоторые примеры, не связанные с математикой для обучения рекурсии (по крайней мере, те проблемы, которые я помню со времен обучения в университете):
Это примеры использования Backtracking для решения проблемы.
Другие проблемы - это классика области искусственного интеллекта: поиск по глубине, поиск путей, планирование.
Все эти проблемы связаны с некой «сложной» структурой данных, но если вы не хотите учить ее математике (числам), тогда ваш выбор может быть более ограниченным. Yoy может начать обучение с базовой структуры данных, такой как связанный список. Например, представление натуральных чисел с использованием списка:
0 = пустой список 1 = список с одним узлом. 2 = список с 2 узлами. ...
затем определите сумму двух чисел в терминах этой структуры данных следующим образом: Пусто + N = N Узел (X) + N = Узел (X + N)
источник
Towers of Hanoi - хороший способ научиться рекурсии.
Есть много решений для этого в Интернете на разных языках.
источник
Детектор палиндрома:
Начните со строки: "ABCDEEDCBA" Если начальный и конечный символы равны, тогда повторите и проверьте "BCDEEDCB" и т. Д.
источник
Алгоритм бинарного поиска звучит так, как вы хотите.
источник
В функциональных языках программирования, когда функции высшего порядка недоступны, вместо императивных циклов используется рекурсия, чтобы избежать изменяемого состояния.
F # является нечистым функциональным языком, который допускает оба стиля, поэтому я буду сравнивать оба здесь. Следующая сумма всех чисел в списке.
Императивная петля с изменяемой переменной
Рекурсивный цикл без изменяемого состояния
Следует отметить , что этот вид агрегации будет захвачен в функциях высшего порядка
List.fold
и может быть написано какList.fold (+) 0 xlist
и в самом деле еще проще с функцией удобства ,List.sum
как толькоList.sum xlist
.источник
Я активно использовал рекурсию в игре, играя в AI. При написании на C ++ я использовал серию из примерно 7 функций, которые вызывают друг друга по порядку (первая функция имеет возможность обойти все из них и вместо этого вызвать цепочку из еще 2 функций). Последняя функция в любой цепочке снова вызывала первую функцию до тех пор, пока оставшаяся глубина, которую я хотел найти, не стала равной 0, и в этом случае последняя функция вызывала бы мою функцию оценки и возвращала оценку позиции.
Многочисленные функции позволили мне легко переходить на основе решений игрока или случайных событий в игре. Я использовал бы передачу по ссылке всякий раз, когда мог, потому что я передавал очень большие структуры данных, но из-за того, как игра была структурирована, было очень трудно иметь «отмененный ход» в моем поиске, поэтому Я бы использовал передачу по значению в некоторых функциях, чтобы сохранить мои исходные данные без изменений. Из-за этого переход к циклическому подходу вместо рекурсивного подхода оказался слишком сложным.
Вы можете увидеть очень общую схему программы такого рода, см. Https://secure.wikimedia.org/wikipedia/en/wiki/Minimax#Pseudocode.
источник
Действительно хороший пример из реальной жизни в бизнесе - это так называемый «Билль о материалах». Это данные, которые представляют все компоненты, составляющие готовый продукт. Например, давайте использовать велосипед. Велосипед имеет руль, колеса, раму и т. Д. И каждый из этих компонентов может иметь подкомпоненты. например, колесо может иметь спицы, шток клапана и т. д. Поэтому, как правило, они представлены в виде древовидной структуры.
Теперь для запроса любой совокупной информации о спецификации или изменения элементов в спецификации часто приходится прибегать к рекурсии.
И образец рекурсивного вызова ...
Очевидно, что класс BomPart будет иметь гораздо больше полей. Возможно, вам придется выяснить, сколько у вас есть пластиковых компонентов, сколько труда нужно для изготовления цельной детали и т. Д. Все это возвращает к полезности рекурсии для древовидной структуры.
источник
Семейные отношения служат хорошим примером, потому что все понимают их интуитивно:
источник
||
дляOR
.Довольно бесполезная, но демонстрирующая внутреннюю работоспособность рекурсии рекурсивна
strlen()
:Нет математики - очень простая функция. Конечно, вы не применяете это рекурсивно в реальной жизни, но это хорошая демонстрация рекурсии.
источник
Еще одна реальная проблема рекурсии, с которой могут столкнуться студенты, - это создать собственный веб-сканер, который получает информацию с веб-сайта и следит за всеми ссылками на этом сайте (и всеми ссылками с этих ссылок и т. Д.).
источник
Я решил проблему с шаблоном коня (на шахматной доске) с помощью рекурсивной программы. Вы должны были перемещать рыцаря так, чтобы он касался каждого квадрата, кроме нескольких отмеченных квадратов.
Вы просто:
Многие виды «продуманных» сценариев могут быть реализованы путем тестирования будущих возможностей в таком дереве.
источник