Palindrome算法和UnboundLocalError

时间:2017-11-03 21:35:25

标签: python algorithm palindrome

这是我在String中查找最长回文的代码。 我收到以下错误消息: " UnboundLocalError:局部变量' Current_Pal'在转让前引用"

我知道变量' Current_Pal"应该在isPal函数内,但如果我这样做,变量将在每个循环初始化为零。

def isPalindrome(s):
    Current_Pal = ''
    Longest_Pal = ''

    def toChars(s):
       s = s.lower()
       ans= ''
       for c in s:
           if c in 'abcdefghijklmnopqrstuvwxyz':
                ans = ans+ c
       return ans

    def isPal(s):
        if len(s) <= 1:
             return Current_Pal + s
        else:
            if s[0] == s[-1]:
                Current_Pal = Current_Pal + s[0]

        else:
            if Current_Pal > Longest_Pal:
                Longest_Pal = Current_Pal
                Current_Pal = ''
        return isPal(s[1:-1])
return isPal(toChars(s))

Palin = isPalindrome("HYTBCABADEFGHABCDEDCBAGHTFYW1234567887654321ZWETYGDE")
print(Palin)

1 个答案:

答案 0 :(得分:1)

你有一个递归函数,所以你需要传入一个初始Current_Pal并继续将该变量传递给后续调用;您也可以对Longest_Pal执行相同操作,如下所示:

def isPal(s, Current_Pal='', Longest_Pal=''):
    if len(s) <= 1:
         return Current_Pal + s
    else:
        if s[0] == s[-1]:
            Current_Pal = Current_Pal + s[0]

    else:
        if Current_Pal > Longest_Pal:
            Longest_Pal = Current_Pal
            Current_Pal = ''
    return isPal(s[1:-1], Current_Pal, Longest_Pal)

这种方式设置为'',然后其他更改会不断传递到方法中,并保留其先前的值。

另外,你应该重写你的其他陈述:

def isPal(s, Current_Pal='', Longest_Pal=''):
    if len(s) <= 1:
         return Current_Pal + s
    elif s[0] == s[-1]:
            Current_Pal = Current_Pal + s[0]
    elif Current_Pal > Longest_Pal:
            Longest_Pal = Current_Pal
            Current_Pal = ''
    return isPal(s[1:-1], Current_Pal, Longest_Pal)