具有递归功能的回文检查,无需切片和循环

时间:2018-12-11 17:16:21

标签: python python-2.7 recursion palindrome

我有一个作业,我必须编写一个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 :(得分:3)

您可以检查给定字符串的第一个和最后一个字符是否相同,然后递归检查其余字符串是否是回文:

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

答案 1 :(得分:0)

我不确定这是否可以算作“更改函数格式”,但这是我在没有分片的递归版本中遇到的问题:

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是具有两个索引ij的递归函数。最后一行将这两个索引的初始位置设置为0(字符串的开头)和len(s) - 1(字符串的结尾),然后进行递归逻辑。递归函数有两个退出条件:

  1. 如果j <= i我们已经到达回文中心。如果到此为止,我们就知道所有其他字符对都匹配,并且不需要进行任何比较。
  2. 如果ij所指向的两个字符不匹配,则肯定不是回文,我们也不需要进行任何比较。 / li>

否则,我们尚不知道序列是否完全回文,因此我们将索引向内移动i + 1, j - 1一步,然后返回到步骤1。

答案 2 :(得分:0)

不使用切片,只需通过递归调用维护索引

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)

答案 3 :(得分:0)

如果提到的功能签名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
>>>

谢谢。