簡體   English   中英

Python中的遞歸單詞檢查

[英]Recursive Word Checking in Python

試圖檢查一個單詞是否可以由一個字符列表組成。 如果能夠從機架中的字母組成單詞,則應返回單詞;如果不能,則返回空白字符串。 我收到錯誤消息TypeError: can only concatenate list (not "str") to list

def checkWord(rack,word,hold):
    if word == "": return hold
    if rack[0] == []: return ""
    if rack[0] == word[0]: return checkWord(rack[1:], word[1:], hold)
    return checkWord(rack[1:] + rack[0], word, hold)
print(checkWord(["a", "s", "m", "t", "p"], "am", "am"))

您不能將列表與字符串連接在一起,因此必須對兩個字符串都使用字符串,或者對兩個列表都使用字符串,請嘗試

def checkWord(rack,word,hold):
    if word == "": return hold
    if rack[0] == []: return ""
    if rack[0] == word[0]: return checkWord(rack[1:], word[1:], hold)
    return checkWord(str(rack[1:]) + str(rack[0]), word, hold)
print(checkWord(["a", "s", "m", "t", "p"], "am", "am"))

或這個

def checkWord(rack,word,hold):
    if word == "": return hold
    if rack[0] == []: return ""
    if rack[0] == word[0]: return checkWord(rack[1:], word[1:], hold)
    return checkWord(list(rack[1:]) + list(rack[0]), word, hold)
print(checkWord(["a", "s", "m", "t", "p"], "am", "am"))

bhansa評論說,您的問題是並置了rack[1:]rack[0] 如果rack是列表,則slice rack[1:]也是列表。 但是, rack[0]將是列表中的單個值。 您可能要用[rack[0]] (用單個項目創建一個新列表)或用rack[:1] (從列表中切出一個項目)代替rack[0]

值得注意的是,如果您輸入的rack是字符串,那么您的原始代碼將起作用(至少,其中一部分會起作用)。 這是因為字符串是一種奇怪的容器,因為索引和切片都為您提供了另一個字符串。

最后要注意的是: if rack[0] == []: return ""基本情況將永遠不會與您顯示的輸入一起運行。 它看起來是否在rack列表中的第一項是另一個列表。 因為您要傳遞一個字符列表(並且僅在遞歸調用中重新排列它們),所以這永遠都不是正確的。 如果您在通過它可以工作rack名單與末尾添加一個特殊sentenel值(這樣你就可以知道,當你完全旋轉的原始列表)。 但這不是你在做什么。 這種方法還會弄亂其他遞歸情況(因為它沒有任何方法可以將空列表前哨匹配字符后移回末尾)。

def checkWord(rack,word,hold):
    try:
        if word == "": return hold
        if rack[0] == []: return ""
        if rack[0] == word[0]: return checkWord(rack[1:], word[1:], hold)
        return checkWord(str(rack[1:]) + str(rack[0]), word, hold)
    except:
        print('it cant')

checkWord(['a','c','b'],'ac','ac') ## return ac
checkWord(['a','c','b'],'dac','dac') ## return It cant

但是我認為這會混淆錯誤,您的函數要么返回true,要么陷入無限循環(如果機架中不包含字母),則應檢查字母是否處於保留狀態->存儲->檢查是否得到所有字母->如果返回返回保留字,否則繼續循環直到結束

而不是檢查word [0]並返回word [1:],而不是稍后通過這種方式,您還忘記添加一個“不能形成單詞”而不引起異常

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM