我正在研究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) 我的代码中的任何帮助都会有很大的帮助。
答案 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)