4

我的任务是定义一个过程 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
4

6 回答 6

7

在您的第一个示例中,您忘记了 return 语句:

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
于 2012-07-16T00:01:23.960 回答
4
        is_palindrome(s[1:len(s)-1])

需要是...

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

在您的第一个版本中,或

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

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

于 2012-07-16T00:00:53.633 回答
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"
于 2013-02-13T09:43:24.110 回答
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]))

希望有帮助

于 2012-07-16T00:10:20.063 回答
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 翻了出来。

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

于 2012-07-16T00:11:57.033 回答
0

爪哇的回答

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));
  }

}
于 2015-06-05T04:52:16.397 回答