python:递归检查以确定字符串是否是回文

时间:2012-07-15 23:55:38

标签: python string recursion

我的任务是定义一个过程is_palindrome,它接受一个字符串作为输入,并返回一个布尔值,指示输入字符串是否为回文结构。在这种情况下,单个字母应返回True,空字符串''也应如此。

不幸的是,我没有得到预期的结果。我很感激帮助。

我的代码版本1:

def is_palindrome(s):
    if s == '':
        return True
    else:
        if (ord(s[0]) - ord(s[len(s)-1])) == 0:
            is_palindrome(s[1:len(s)-1])
        else:
            return False

print is_palindrome('')
#>>> True    (expected = True)

print is_palindrome('abab')
#>>> False    (expected = False)

print is_palindrome('abba')
#>>> None    (expected = True)

print is_palindrome('andrea')
#>>> None    (expected = False)

print is_palindrome('abaaba')
#>>> None    (expected = True)

我通过调试器跟踪了我的代码,似乎逻辑是正确的,因为代码采用了适当的路径。但是,如上所述,某些案例的最终结果似乎会转为“无”。

如果我将代码更改为以下内容:

我的代码版本2:

def is_palindrome(s):
        if s == '':
            result = True
        else:
            if (ord(s[0]) - ord(s[len(s)-1])) == 0:
                is_palindrome(s[1:len(s)-1])
            else:
                result = False
        return result

print is_palindrome('')
#>>> True    (expected = True)

print is_palindrome('abab')
#>>> False    (expected = False)

print is_palindrome('abba')
#>>> Error    (expected = True)
UnboundLocalError: local variable 'result' referenced before assignment 

print is_palindrome('andrea')
#>>> Error   (expected = False)         
UnboundLocalError: local variable 'result' referenced before assignment

print is_palindrome('abaaba')
#>>> Error    (expected = True)
UnboundLocalError: local variable 'result' referenced before assignment

6 个答案:

答案 0 :(得分:7)

在您的第一个示例中,您忘记了一个返回声明:

def is_palindrome(s):
    if s == '':
        return True
    else:
        if (ord(s[0]) - ord(s[len(s)-1])) == 0:
            # v-- forgot this here
            return is_palindrome(s[1:len(s)-1])
        else:
            return False

答案 1 :(得分:4)

        is_palindrome(s[1:len(s)-1])

需要......

        return is_palindrome(s[1:len(s)-1])

在您的第一个版本中,或

        result = is_palindrome(s[1:len(s)-1])

在你的第二个。否则,您实际上永远不会将递归调用的返回值传播回原始调用者。

答案 2 :(得分:3)

# ask user to enter any string
a = raw_input("Enter the string : ")
#palindrome check
print (a == a[::-1]) and "String is palindrome" or "String is not palindrome"

答案 3 :(得分:2)

def is_palindrome(s):
    if not s:
        return True
    else:
        return s[0]==s[-1] and is_palindrome(s[1:-1])

或者,如果你想要一个单行:

def is_palindrome(s):
    return (not s) or (s[0]==s[-1] and is_palindrome(s[1:-1]))

希望有所帮助

答案 4 :(得分:2)

让我们逐行逐步完成你的第二个例子。:

def is_palindrome(s):

在这种情况下,让我们让s =“abba”,这是你收到错误的第一个字符串:

        if s == '':

评估为

        if 'abba' == '':

哪个是False,因此我们跳到else

        else:
            if (ord(s[0]) - ord(s[len(s)-1])) == 0:

if语句相当于:

            if (97 - 97) == 0:

它是True,所以递归发生:

                is_palindrome(s[1:len(s)-1])

                is_palindrome('bb')

现在无论这个递归的结果如何,我们都会忽略它,因为不会保存返回值。因此,当我们到达这一行时:

        return result

我们从来没有定义result是什么,所以Python翻了出来。

其他海报已经很好地回答了你的问题。我发帖说明了跟踪程序查找/修复错误的重要性。

答案 5 :(得分:0)

Respuesta en Java

public class Varios {

/**
 * @param args the command line arguments
 */
  public static void main(String[] args) {
    System.out.println( pali("anitalavalatina"));
  }
  static boolean pali(String palabra){
    System.out.println(palabra);
    if (palabra.length()-1<2) 
            return true;
    if(palabra.charAt(0)!=palabra.charAt(palabra.length()-1)) return false;
    return pali(palabra.substring(1,palabra.length()-1));
  }

}