Шаг 70.
Рекурсия на Python. Линейная рекурсия I: основные алгоритмы. Системы счисления. Строки. Является ли строка палиндромом?

    На этом шаге мы рассмотрим рекурсивное решение этой задачи.

    Цель следующей задачи - выяснить, является ли строка палиндромом, то есть цепочкой символов, которая одинаково читается в прямом и обратном направлениях (например, 'радар'). Её размер - длина строки, так как ею определяется количество операций, необходимых для получения результата. У этой задачи два начальных условия:

В обоих случаях результатом будет True (Истина). Как и для функции из примера 2.6, здесь необходимо второе начальное условие, поскольку при декомпозиции задачи мы будем уменьшать её размер на две единицы. В данном случае подзадача исключает первый и последний символы исходной строки длиной n ≥ 2. Результатом функции для некоторой строки s = s0 s1 ... sn-2 sn-1 длиной n будет выражение:
    (s0 = sn-1) ∧ (s1 = sn-2) ∧  ... ∧ (s⌊ n/2 ⌋-1 = sn-⌊ n/2 ⌋),
где - логическая операция И (конъюнкция), а si - символ строки s в позиции i (первый символ - в позиции 0). Заметим, что сумма индексов сопоставляемых символов равна n - 1. Кроме того, необходимо сравнить только ⌊ n/2 ⌋ пар символов. Приведённое выражение можно записать короче, подобно сумме:
  ⌊ n/2 ⌋-1
     (si = sn-i-1)
    i=0
Соответствующая рекурсивная схема:

    Таким образом, логическая функция может быть определена как:

            True,                     если n < 2,
    f(s) = 
            (s0 = sn-1) ∧ f(s1...n-2), если n ≥ 2,
где s1...n-2 обозначает подстроку s1 ... sn-2.

    Наконец, пример 4.12 представляет код с временной сложностью Θ(n).


Пример 4.12. Функция проверки строки на палиндром
1
2
3
4
5
6
def is_palindrome(s):
    n = len(s)
    if n <= 1:
        return True
    else:
        return (s[0] == s[n - 1]) and is_palindrome(s[1:n - 1])    
Архив с файлом можно взять здесь.

    Со следующего шага мы рассмотрим еще несколько других задач.




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