回文 - Python中的递归

时间:2013-11-26 03:14:16

标签: python recursion palindrome

我正在研究Python代码,我必须使用递归来测试列表是否是回文并且遇到混乱和我的代码问题:

def isPalindrome( thesublist ) :

    thesublisttest = thesublist[0:]
    if len(thesublisttest) <= 1:
        return True
    elif len(thesublisttest) == 2:
        x = thesublisttest[0]
        y = thesublisttest[1]
        if x == y:
            return True
        else:
            return false == thesublisttest.pop(0)
    elif len(thesublisttest) > 2:
        first = thesublisttest.pop(0)
        last = thesublisttest.pop()
        if first == last:
           return isPalindrome(thesublisttest)
        else:
         return False


def maxPalindrome( thelist ) :

        completelist=thelist[:]
        completelist.reverse()
        complete=len(thelist)-1

        for i in range(complete):
                if completelist[:]==thelist[:]:
                        x=len(thelist)
                        y=0
                        return(x,y)
                elif completelist[i:complete]==thelist[i:complete]:
                        successlist=thelist[i:complete]
                        a=i
                        b=len(thelist)-a
                        return (a,b)
        thelisttest = thelist[0:]
        if thelisttest:
                    return (0,0)


# test

candidatePs = [ 

        [1,], 

        range(8), 

        range(4)+range(3,-1,-1), 

         range(4)+[0]+range(3,-1,-1),

         range(3)+range(4)+[0]+range(3,-1,-1),

        [8,3,2,3],

        ]

for p in candidatePs :

    print p, isPalindrome( p )

    print p, "max", maxPalindrome( p )

我不确定我所做的是否被认为是递归而且我也知道[8,3,2,3]应该显示max(3,1)并且我的代码将其吐出为max(0,0) 我的代码中的任何帮助都会有很大的帮助。

1 个答案:

答案 0 :(得分:0)

def max_palindrome(s, start_at):
    # recursion base, a list with only 1 item is a palindrome OR 
    # a list that's equals to its reverse
    if len(s) == 1 or s == s[::-1]:
        return (len(s), start_at)
    # if we got here the current list is not a palindrome, 
    # lets try to scan it by taking out one element from each of its sides
    return max(max_palindrome(s[1:], start_at+1), 
       max_palindrome(s[:-1], start_at))

for p in candidatePs :
    print p, "max", max_palindrome(p)

输出:

[1] max (1, 0)
[0, 1, 2, 3, 4, 5, 6, 7] max (1, 7)
[0, 1, 2, 3, 3, 2, 1, 0] max (8, 0)
[0, 1, 2, 3, 0, 3, 2, 1, 0] max (9, 0)
[0, 1, 2, 0, 1, 2, 3, 0, 3, 2, 1, 0] max (9, 3)
[8, 3, 2, 3] max (3, 1)