Python中的递归函数回文字符串

10

我需要帮助编写一个递归函数,用于检测一个字符串是否为回文。但是我不能使用任何循环而必须使用递归。有人能帮助我展示如何实现吗?我正在使用Python。

10个回答

69
def ispalindrome(word):
    if len(word) < 2: return True
    if word[0] != word[-1]: return False
    return ispalindrome(word[1:-1])

这里是最佳单行代码

def ispalindrome(word):
    return word == word[::-1]

这很酷..谢谢!! - vijayraj34
这一行代码使用递归函数吗?我不这么认为... - Random Person

47

从一般的算法角度来看,递归函数有三种情况:

1) 0个项目。 该项是一个回文,因为它本身就是。

2) 剩余1个项目。 该项是一个回文,因为它本身就是。

3) 剩余2个或更多项目。 去除第一个和最后一个项目。 比较。 如果它们相同,则在字符串的剩余部分上调用函数。 如果第一个和最后一个不同,则该项不是回文

函数本身的实现留给读者作为练习 :)


3

既然我们已经在发布代码,而且还没有发布一行代码,那就来吧:

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

1
-1:发布别人的作业代码——这是不道德的。 - S.Lott
2
如果这是真正的作业,我会同意你的看法,但事实并非如此。提问者正在为期中考试学习。仅仅记住这个答案而不尝试理解它是没有帮助的:在考试中,他肯定需要解决一个不同的递归问题。 - Stephan202

3

如果一个字符串长度为零或一,那么它是回文的。

如果一个字符串的第一个和最后一个字母相同,并且剩余的字母(我认为在Python中是[1: -1]切片,但我的Python有点生疏)也是回文的,则它是回文的。

现在,编写一个接受字符串参数的回文函数。它将会调用自己。


2

以下是一种思考简单递归函数的方法...将问题颠倒过来,以这种方式思考。如何递归地创建回文?这是我会这样做的...

def make_palindrome():
    maybe:
        return ""
    elsemaybe:
        return some_char()
    else:
        c = some_char()
        return c + make_palindrome() + c

然后您可以翻转它来构建测试。

2
这里是另一种观点:
回文字符串包括以下三种情况:
1. 一个字母 x。
2. 一个回文子串。
3. 重复同一个字母 x。
请注意,可能会给你一个带标点符号的英语句子 "Able was I ere I saw Elba."。你的回文检查程序可能需要忽略标点符号,并且不区分大小写。这会稍微复杂一些。
回文字符串的格式如下:
1. 可能有前导标点符号。一个字母 x。
2. 一个回文子串。
3. 不区分大小写的重复字母 x。可能有尾随标点符号。
根据定义,长度为零的字符串也是回文字符串。同样,一个单独的字母(去除标点符号后)也是回文字符串。

1
该函数应接受一个字符串。如果字符串中有超过一个字母,则比较第一个和最后一个字母。如果只有1个或0个字母,则返回true。如果两个字母相等,则再次调用该函数,但是不包括第一个和最后一个字母的字符串。如果它们不相等,则返回false。
 palindrom( word):
   IF length of word 1 or 0 THEN
      return 0;
   IF last and first letter equal THEN
     word := remove first and last letter of word;
     palindrom( word);
   ELSE
     return false;

0
a=raw_input("enter the string:")
b=len(a)
c=0
for i in range(b):
    if a[i]==a[-(i+1)]:
        c=c+1
if c==b:
    print a,"is polindrome"
else:
    print a,"is not polindrome"

3
我看不出它有多么递归。 - billwild
8
大约是0%递归。 - Thomas

0

我的解决方案

#To solve this I'm using the stride notation within a slice [::]
def amazonPalindrome(input):
    inputB = input
    input = input[::-1]
    #print input
    noPalindrome = inputB + " is not a palindrome"
    isPalindrome = inputB + " is a palindrome"
    #compare the value of the reversed string to input string
    if input[0]!= input[-1]: 
        print noPalindrome
    else:
        print isPalindrome


#invoking the def requires at least 1 value or else it fails
#tests include splitting the string,mixing integers, odd amount palindromes.
#call the def  
amazonPalindrome('yayay')

-1
n=raw_input("Enter a number===>")
n=str(n)
l=len(n)
s=""
for i in range(1,l+1):
    s=s+n[l-i]
if s==n:
    print "Given number is polindrom"
else:
    print "Given number is not polindrom"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接