Проверка палиндрома с рекурсивной функцией без нарезки и петель - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть задание, я должен сделать код Python, который проверяет, является ли строка палиндромом, используя рекурсивную функцию, которая возвращает логическое значение, но мне не разрешено использовать обратные срезы или циклы, и мне не разрешеноизмените формат функции, вот мой код, но он всегда возвращает True

def is_palindrome(s):
    res = []
    s = ['']
    if len(s) < 2:
        return True
    else:
        rev_s = is_palindrome(s[1:]) + s[0]
        res.append(rev_s)
        if res == s:
            return True
        return False

Ответы [ 4 ]

0 голосов
/ 11 декабря 2018

Если указанная функция подписи def is_palindrome(s) является подписью, данной вашим учителем, тогда нет проблем и нет необходимости передавать какие-либо дополнительные параметры для достижения цели.

Ваш учитель (или тот, который дал вам)эта задача замечательная) просто хотел проверить, как вы справляетесь с этим только с одним параметром.

Концепция очень проста, просто измените тип аргумента (to list with 3 values) во втором рекурсивном вызове.

def is_palindrome(s):
    if type(s) is str:
        l = len(s) 

        if l == 0 or l == 1:
            return True
        else:
            return is_palindrome([s, 0, -1])
    else:
        string, start, end = s # s is list here

        if string[start] != string[end]:
            return False
        else:
            if(start + 1 >= end - 1):
                return True

            return is_palindrome([s, start + 1, end - 1])

def main():
    string1 = "abcba"
    string2 = "abcde"
    string3 = "AxxA"

    print(is_palindrome(string1)) # True
    print(is_palindrome(string2)) # False
    print(is_palindrome(string3)) # True

main();

Это не то, что вы ищете, но, возможно, вы будете искать это в будущем.

>>> def is_palindrome(s):
...     if s == "".join(reversed(s)):
...         return True
...     else:
...         return False
...
>>> is_palindrome("ABA")
True
>>>
>>> is_palindrome("ABC")
False
>>>
>>> is_palindrome("XXZZXX")
True
>>>
>>> is_palindrome("@#7")
False
>>>
>>> is_palindrome("1@#@1")
True
>>>

Спасибо.

0 голосов
/ 11 декабря 2018

Я не уверен, считается ли это «изменением формата функции», но вот мое замечание по рекурсивной версии без слайсов:

def is_palindrome(s):
  def is_palindrome_r(i, j):
    if j <= i:
      return True
    if s[i] != s[j]:
      return False
    return is_palindrome_r(i + 1, j - 1)

  return is_palindrome_r(0, len(s) - 1)

Внутренняя функция, is_palindrome_r, является рекурсивнойфункция, которая принимает два индекса, i и j.Последняя строка устанавливает начальные позиции для этих двух индексов на 0 (начало строки) и len(s) - 1 (конец строки) и продолжает рекурсивную логику.У рекурсивной функции есть два условия выхода:

  1. , если j <= i мы достигли центра нашего палиндрома.Если мы дошли до этого уровня, мы знаем, что все остальные пары символов совпадают, и нам не нужно больше сравнивать.
  2. , если два символа указывают на i и j не соответствует, это определенно не палиндром, и нам не нужно больше сравнивать.

В противном случае мы еще не знаем, является ли последовательность полностью палиндромной, поэтомумы перемещаем наши индексы на один шаг внутрь (i + 1, j - 1) и возвращаемся к шагу 1.

0 голосов
/ 11 декабря 2018

Срезы не используются, просто поддерживайте индексы с помощью рекурсивных вызовов

def is_palindrome(s):
  return helper(s, 0, len(s)-1)

def helper(s, i, j):
  if (i >= j):
    return True
  return s[i] == s[j] and helper(s, i+1, j-1)
0 голосов
/ 11 декабря 2018

Вы можете проверить, являются ли первый и последний символ данной строки одинаковыми, а затем рекурсивно проверить, является ли оставшаяся строка палиндромом:

def is_palindrome(s):
    return len(s) < 2 or s[0] == s[-1] and is_palindrome(s[1:-1])
...