Шаг 58.
Рекурсия на Python. ... . Общий метод решения разностных уравнений. Дробные аргументы рекурсивной функции

    На этом шаге мы рассмотрим преобразования дробных аргументов рекурсивной функции.

    Общий метод вывода формулы для рекуррентных соотношений применим лишь тогда, когда аргументы их T-членов представляют собой разности вида n - b, где b - некоторая целочисленная константа. Однако в отдельных случаях эту задачу можно решить, когда аргументы T-членов представляют собой дроби вида n/b, где b - некоторая целочисленная константа. Ключевая идея здесь заключается в предположении, что n - это степень b, и последующем преобразовании дроби в разность путём замены n = bk.

    Рассмотрим рекуррентное соотношение (3.30) с рекурсивным условием

    T(n) = 2T(n/2) + 1,
предположив, что n - степень двух. Поскольку аргумент T-члена в правой части - n/2, необходимо произвести замену n = 2k, чтобы получить:
    T(2k) = 2T(2k/2) + 1 = 2T(2k-1) + 1.

    В этом новом определении T(2k) есть функция k. Поэтому её можно заменить на t(k) следующим образом:

    t(k) = 2t(k - 1) + 1,
а такое рекуррентное соотношение можно решить общим методом для разностных уравнений. То есть сначала привести его к виду
    t(k) - 2t(k - 1) = 1 * 1n
и записать его характеристический полином
    (x - 2)(x - 1).

    Тогда сама функция должна иметь следующий вид:

    t(k) = С1 + С22k       .    (3.43)

    Выполнив обратную замену, получаем общее решение рекуррентного соотношения от исходной переменной n:

    T(n) = С1 + С2n     .               (3.44)  

    Последний шаг - определение констант С1 и С2. Их можно найти из (3.43) или из (3.44). Для T мы можем использовать начальные условия T(1) = 1 и T(2) = 3. Аналогичные начальные условия для t: t(0) = T(20) = T(1) = 1 и t(1) = T(21) = T(2) = 3. В любом случае, система линейных уравнений будет иметь вид:

    C1 + C2 = 1 = T(1) = t(0)
    C1 + 2C2 = 3 = T(2) = t(1)

    Её решение: C1 = -1 и C2 = 2, а формулой для T(n) будет:

    T(n) = 2n - 1 ∈ Θ(n).

    В следующем рекурсивном определении

        1,               если n = 1
T (n) = 
        2T(n/4) + log2n, если n > 1,
можно предположить, что аргументом рекурсивной функции T будет степень четырёх. В этом случае замена переменной n = 4k приводит к
    T(4k) = 2T(4k/4) + log24k = 2T(4k-1) + k log2 4 = 2T(4k-1) + 2k.

    Следующий шаг - замена t(k) = T(4k):

    t(k) = 2t(k - 1) + 2k.

    Мы назовём эту операцию "заменой функции", чтобы подчеркнуть, что замена касается только T-членов (t-членами) и не влияет на все остальные члены (в данном случае - 2k). Приводим рекуррентное соотношение к каноническому виду

    t(k) - 2t(k - 1) = 2k * 1k,
характеристический полином которого -
    (х - 2)(х - 1)2.

    Таким образом, формула для этого рекуррентного соотношения:

    t(k) = C12k + C2 + C3k.

    Чтобы вернуться к функции T, нужно произвести обратную замену k = log4 n. Однако нам необходимо выражение для 2k. Заметим, что n = 4k = (2 * 2)k = (22)k = (2k)2, поэтому 2k = √n, что даёт:

    T(n) = C1√n + C2 + C3 log4 n.

    Наконец, исходя из начального условия T(1) = 1, можно вычислить T(4) = 2T(1) + log2 4 = 4 и T(16) = 2T(4) + log2 16 = 12, что позволяет нам найти константы Ci из решения следующей системы линейных уравнений:

    C1 + C2 = 1 = T(1)
    2C1 + C2 + C3 = 4 = T(4)
    4C1 + C2 + 2C3 = 12 = T(16).

    Её решение: C1 = 5, C2 = -4 и C3 = -2, а формула для T(n):

    T(n) = 5√n - 4 - 2 log4 n ∈ Θ(n1/2).

    Если аргумент T в рекурсивном выражении - квадратный корень, можно воспользоваться заменой n = 2(2k). Рассмотрим следующее рекуррентное соотношение:

    T(n) = 2T(√n) + log2 n,       (3.45)
где T(2) = 1 и n = 2(2k) (заметим, что 2(2k) ≠ 4k). Это последнее ограничение для n гарантирует, что рекурсивная процедура завершится при начальном условии для n = 2. После замены переменной получим:
    T(2(2k)) = 2T(2(2k/2)) + log2 2(2k) = 2T(2(2k-1)) + 2k,
а после замены функции t(k) = T(2(2k)) рекуррентное соотношение принимает вид
    t(k) = t(k - 1) + 2k,
характеристический полином которого
    (х - 2)(х - 2).

    Поэтому новое рекуррентное соотношение будет иметь вид:

    t(k) = C12k + C2k2k.

    Для отмены замены переменной нужно применить подстановку k = log2(log2 n) или 2k = log2 n. Таким образом, рекуррентное соотношение как функция n будет иметь вид:

    T(n) = C1 log2 n + C2(log2(log2 n)) log2 n.    (3.46)

    Наконец, чтобы найти константы, используем начальные условия T(2) = 1 и T(4) = 4. Для этого нужно решить следующую систему линейных уравнений:

    C1 = 1 = T(2)
    2C1 + 2C2 = 4 = T(4)

    Её решение: C1 = C2 = 1. Поэтому конечная формула для T(n):

    T(n) = log2 n + (log2(log2 n)) log2 n ∈ Θ((log(log n)) log n).    (3.47)

    На следующем шаге мы рассмотрим многократные замены переменной или функции.




Предыдущий шаг Содержание Следующий шаг