Python中的递归单词检查

时间:2017-09-10 07:27:02

标签: python recursion

尝试检查是否可以从字符列表中创建单词。它应该返回单词,如果它可以从机架中的字母,而空白字符串,如果它不能。我收到错误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"))

3 个答案:

答案 0 :(得分:0)

你不能用列表连接一个列表,所以你必须为两者使用字符串,或者为两者使用列表,试试这个

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"))

答案 1 :(得分:0)

bhansa评论说,您的问题在于联接rack[1:]rack[0]。如果rack是列表,那么切片rack[1:]也是如此。但是,rack[0]将是列表中的单个值。您可能希望将rack[0]替换为[rack[0]](使用单个项目创建新列表)或rack[:1](从列表中切换一个项目)。

值得注意的是,如果您对rack的输入是一个字符串,那么您的原始代码将起作用(至少,它的那部分会起作用)。那是因为字符串是一种奇怪的容器,因为索引和切片都会给你另一个字符串。

最后一点:您的基本案例if rack[0] == []: return ""将永远不会与您显示的输入一起运行。它查看rack列表中的第一项是否是另一个列表。由于您传递了一个字符列表(并且只在递归调用中重新排列它们),因此永远不会成立。如果你传入一个rack列表,并且在末尾添加了一个特殊的句子值,那么就可以工作(这样你就可以知道你什么时候完全旋转了你的原始列表)。但那不是你正在做的事情。这种方法也会破坏其他递归情况(因为它没有任何方法可以在空字符匹配字符后将空列表标记移回到最后)。

答案 2 :(得分:0)

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,要么陷入无限循环(如果机架不包含字母), 它应该检查信件是否处于保持状态 - >商店 - >检查是否有所有字母 - >如果得到返回保持字,否则继续循环直到结束

而不是检查单词[0]并返回单词[1:],而不是以后的方式 你也忘了添加一个" can&t; t形式的单词"没有抛出异常