要从列表中查找秘密单词?

时间:2015-01-29 10:34:39

标签: python recursion

我必须使用函数isIn(secretWord,lettersGuessed)从列表中找到秘密单词。在下面发布我的代码。

def isWordGuessed(secretWord, lettersGuessed):

    if secretWord=="" or lettersGuessed==[]:
        return False
    if secretWord[0:] in lettersGuessed:
     return True
    else:
     return isWordGuessed(secretWord[1:],lettersGuessed)

对于某些例子,我得到了错误的答案。其中一些是:

isWordGuessed('apple', ['a', 'e', 'i', 'k', 'p', 'r', 's'])

在上面的例子中,我得到了True作为输出,应该是False,因为一旦secretWord的字母在猜测中被猜到正确,它会在第二次递归中排除它。我需要知道是否有一种方法可以排除从列表中猜出来的一次字母。想知道。

由于

P.S。我得到了解决方案,但在这里提出的类似问题中使用了不同的代码,但要了解我需要知道我哪里出错了。

2 个答案:

答案 0 :(得分:2)

按条件分解条件:

if secretWord=="" or lettersGuessed==[]:
    return False

如果为空,则返回false。看起来很简单。

if secretWord[0:] in lettersGuessed:
 return True

如果第一个字母是保密字,则返回True。好的,让我们来看看电话:

isWordGuessed('apple', ['a', 'e', 'i', 'k', 'p', 'r', 's'])

好吧,secretWordlettersGuessed都不是空的,所以我们转到第二个条件。

由于apple的第一个字母位于猜测字母中,因此该函数返回True - 因此错误。


编辑:有人指出secretWord[0:]得到了整个词,这并不能解释为什么它有时会起作用。原因实际上与上述相似,但反之亦然。

第二个条件,只会使用 last 字母

调用

由于appleppleplele不在lettersGuessed最终检查,'e' in lettersGuessed将返回false 。因此,最后一个字母在数组中的任何调用都将返回True。


你想要的是这个:

def isWordGuessed(secretWord, lettersGuessed):

    if secretWord=="" or lettersGuessed==[]:
        return False
    else:
     return secretWord[0] in lettersGuessed and isWordGuessed(secretWord[1:],lettersGuessed)

因为你需要第一个字母在lettersGuessed以及其他字母也在那里。

答案 1 :(得分:2)

一些修正:

>>> def isWordGuessed(secretWord, lettersGuessed):
...         if secretWord=="" or lettersGuessed==[]:
...             return False
            # secretWord[0:] picks whole word not a single character so replace with secretWord[0]
            # also flip the condition
...         if secretWord[0] not in lettersGuessed:  
...             return False
            # an extra check for the last word otherwise it would do one more recursion and return false by condition 1
...         if len(secretWord)==1 and secretWord in lettersGuessed:  
...             return True
...         else:
...             return isWordGuessed(secretWord[1:],lettersGuessed)
... 
>>> isWordGuessed('apple', ['a', 'e', 'i', 'k', 'p', 'r', 's'])
False
>>> isWordGuessed('apple', ['a', 'e', 'i', 'l', 'p', 'r', 's'])
True