3 回答

TA貢獻(xiàn)1847條經(jīng)驗 獲得超11個贊
您可以檢查給定字符串的第一個和最后一個字符是否相同,然后遞歸檢查剩余的字符串是否為回文:
def is_palindrome(s): return len(s) < 2 or s[0] == s[-1] and is_palindrome(s[1:-1])

TA貢獻(xiàn)1829條經(jīng)驗 獲得超7個贊
如果提到的函數(shù)簽名def is_palindrome(s)是你老師給的簽名,那么沒問題,不需要傳遞任何額外的參數(shù)來實現(xiàn)目標(biāo)。
你的老師(或者給你這個任務(wù)的老師很棒)只是想看看你是如何只用 1 個參數(shù)來處理這個問題的。
概念很簡單,只需(to list with 3 values)在第二次遞歸調(diào)用中更改參數(shù)類型即可。
def is_palindrome(s):
if type(s) is str:
l = len(s)
if l == 0 or l == 1:
return True
else:
return is_palindrome([s, 0, -1])
else:
string, start, end = s # s is list here
if string[start] != string[end]:
return False
else:
if(start + 1 >= end - 1):
return True
return is_palindrome([s, start + 1, end - 1])
def main():
string1 = "abcba"
string2 = "abcde"
string3 = "AxxA"
print(is_palindrome(string1)) # True
print(is_palindrome(string2)) # False
print(is_palindrome(string3)) # True
main();
以下內(nèi)容不是您要查找的內(nèi)容,但可能是您將來要查找的內(nèi)容。
>>> def is_palindrome(s):
... if s == "".join(reversed(s)):
... return True
... else:
... return False
...
>>> is_palindrome("ABA")
True
>>>
>>> is_palindrome("ABC")
False
>>>
>>> is_palindrome("XXZZXX")
True
>>>
>>> is_palindrome("@#7")
False
>>>
>>> is_palindrome("1@#@1")
True
>>>
謝謝你。

TA貢獻(xiàn)1820條經(jīng)驗 獲得超9個贊
我不確定這是否算作“更改函數(shù)格式”,但這是我對沒有切片的遞歸版本的嘗試:
def is_palindrome(s):
def is_palindrome_r(i, j):
if j <= i:
return True
if s[i] != s[j]:
return False
return is_palindrome_r(i + 1, j - 1)
return is_palindrome_r(0, len(s) - 1)
內(nèi)部函數(shù)is_palindrome_r是采用兩個索引i和的遞歸函數(shù)j。最后一行在0(字符串的開頭)和len(s) - 1(字符串的結(jié)尾)設(shè)置這兩個索引的初始位置,并繼續(xù)執(zhí)行遞歸邏輯。遞歸函數(shù)有兩個退出條件:
如果j <= i我們到達(dá)了回文的中心。如果我們已經(jīng)走到這一步,我們知道所有其他字符對都匹配,我們不需要再進(jìn)行任何比較。
如果兩個角色的指向i和j 不匹配,這絕對不是一個回文,我們不需要做任何更多的比較。
否則我們還不知道序列是否完全回文,所以我們將索引向內(nèi)移動一步 ( i + 1, j - 1) 并返回到步驟 1。
添加回答
舉報