我必须使用函数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。我得到了解决方案,但在这里提出的类似问题中使用了不同的代码,但要了解我需要知道我哪里出错了。
答案 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'])
好吧,secretWord
或lettersGuessed
都不是空的,所以我们转到第二个条件。
由于apple
的第一个字母位于猜测字母中,因此该函数返回True - 因此错误。
编辑:有人指出secretWord[0:]
得到了整个词,这并不能解释为什么它有时会起作用。原因实际上与上述相似,但反之亦然。
第二个条件,只会使用 last 字母
调用由于apple
,pple
,ple
和le
不在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