Фото Романа Mager на Unsplash
Во время семестра в колледже я взял предмет под названием «Дискретная математика». Лектор решил разделить класс в группах. Каждая группа состояла из 2 или 3 студентов. Они должны были сделать экспозиции о конкретном предмете, назначенном лектором.
В группе я был на (мы были только два, на самом деле), мы были назначены с предметом Рецидивирующие отношения . По словам Википедии , это:
Уравнение, которое рекурсивно определяет последовательность или многомерный массив значений, приведен один или несколько начальных терминов: каждый дальнейший срок последовательности или массива определяется как функция предыдущих терминов.
Другими словами, а Рекурсивная функция 😉
Идеальная ситуация, чтобы объяснить эту концепцию с кодом: D
Ханой Башни
Ты помнишь эту игрушку?
Знаменитые башни Ханой. Игра состоит из перемещения каждого диска из первого полюса до последнего (слева направо или вицеверса), в наименьшее количество шагов. Правила заключаются в том, что больший диск не может быть более меньшим, и вы можете переместить только один диск в то время. Что-то вроде этого:
Эта проблема имеет алгоритм, который решает его, он идет так:
Где n это количество дисков в проблеме.
Давайте код что
Давайте использовать Python, чтобы написать этот алгоритм. Это что-то подобное:
def hanoi(n): if n <= 1: return 1 else: return 2 * hanoi(n-1) + 1
Так что, если у нас есть 4 диска …
>>> hanoi(4) 15
Хороший. Оно работает. Давайте дадим Несколько попыток
>>> hanoi(5) 31 >>> hanoi(10) 1023 >>> hanoi(40) 1099511627775
Выглядит довольно хорошо. Теперь я знаю, сколько движется, что он возьмет у меня, если я использую 40 дисков (кстати, это займет вас 10460 лет, никогда не пробую это дома). Но что, если у меня будет 7000?
>>> hanoi(7000) Traceback (most recent call last):which File "", line 1, in File " ", line 3, in hanoi File " ", line 3, in hanoi File " ", line 3, in hanoi [Previous line repeated 994 more times] File " ", line 2, in hanoi RecursionError: maximum recursion depth exceeded in comparison
Ох … кажется, это не достаточно исполняется. Конечно, вы можете «решить» это просто увеличение максимальной глубины рекурсии в Python (с Sys.setrocursionlimit (n)
), но это гораздо лучшая идея оптимизировать это.
Оптимизация
Есть несколько способов решить рецидивные отношения, один из них – Итерация Отказ Он состоит из решавления операции шага за шагом и вычитая нерешительное уравнение из процесса. Сначала мы стараемся решить данную ценность:
Затем, от последней строки, мы можем вывести эквивалентное уравнение:
Если вы заметите, T (4) + 7
такой же, как t (4) ^ (4-1) + (2^(4-1) - 1)
Вот почему это наше первоначальное утверждение. Но теперь мы решили отношение рецидива, давайте использовать это в нашем коде.
def better_hanoi(n): return 2**n - 1
А потом…
Теперь мы знаем, сколько шагов возьмут, чтобы решить его с 7000 дисками (вероятно, на всю жизнь вселенной, несколько раз).
Заключение
Мы оптимизировали небольшой алгоритм с концепциями дискретной математики, это просто чтобы дать небольшое представление о том, как мы можем воспользоваться такими простыми концепциями, чтобы построить лучшие программы.
Оригинал: “https://dev.to/socratesdz/optimizing-code-with-algebra-37en”