2 回答

TA貢獻1936條經(jīng)驗 獲得超7個贊
我認為你的解決方案很好,但如果你真的想要一個遞歸函數(shù),那么下面函數(shù)的格式是函數(shù)式編程的典型格式:
def check_letters(compare_to, lst):
if len(lst) == 0:
return True
else:
if lst[0] in compare_to:
return check_letters(compare_to, lst[1:]) # recursive step
else:
return False
if check_letters(userInput, letters):
...
所以這個想法是檢查列表的“頭部”(第 0 個元素),如果它符合你的謂詞,你就用列表的“尾部”繼續(xù)遞歸。
因此,每個遞歸步驟檢查列表中的第一個元素,然后將列表的其余部分“向下”轉(zhuǎn)發(fā)。這里我使用切片:
l = [1,2,3]
print(l[1:]) # create a new list from index 1
# Outputs: [2,3]
由于python是零索引的,1表示第二個元素。
為了支持@cdlane指出的重復(fù)字母,遞歸可以傳遞輸入并替換出現(xiàn):
return check_letters(compare_to.replace(lst[0], "", 1), lst[1:]) # recursive step

TA貢獻1840條經(jīng)驗 獲得超5個贊
遠離基于集合的解決方案是解決其灰色區(qū)域的機會:如何處理重復(fù)的字母。即letters = ["f", "f"]vs"wife"和"giraffe"。True兩者都返回基于集合的解決方案。但我們可以這樣做:
def check_letters(string, array):
if not array:
return True
head, *tail = array
index = string.find(head)
if index == -1:
return False
return check_letters(string[:index] + string[1 + index:], tail)
letters = ["f", "f", "s"]
userInput = "false"
print(check_letters(userInput, letters))
userInput = "falsify"
print(check_letters(userInput, letters))
輸出
> python3 test.py
False
True
>
添加回答
舉報