这是我第二次就麻省理工学院edX课程中的任务向你寻求帮助。
任务是: 如果一个单词按顺序包含字母e,r,i和c,则该单词被认为是erician。例如,我们会说以下单词是erician:“meritocracy”,“generic”,“derrick”,“euphoric”,“heretic”和“electric”,因为它们每个都以正确的顺序包含这四个字母。 “米饭”这个词不是埃里克语,因为这四个字母出现的顺序错误。
在这个问题中,我们希望你编写一个更通用的函数x_ian(x,word),如果x中的所有字母都以与x中出现的顺序相同的顺序包含在单词中,则返回True。
此函数必须递归!您不能使用循环(for或while)来解决此问题。
这是我的功能代码:
if x=="":
return True
if len(x)>len(word):
return False
if x==word:
return True
elif (x[0]==word[0]):
x_ian(x[1:],word[1:])
else:
x_ian(x,word[1:])
我目前不知道为什么我的函数返回None,而不是True或False。我在IDLE上使用了调试器,它完成了执行 'main'.x_ian()。line49:return True
然而该函数返回None。
非常感谢您的帮助。
答案 0 :(得分:2)
您需要返回递归调用的输出:
elif (x[0]==word[0]):
return x_ian(x[1:],word[1:])
else:
return x_ian(x,word[1:])
否则python只会到达你的函数的末尾,这意味着它将返回None
;函数的默认返回值。
您的代码可以简化为:
def x_ian(x, word):
if not x or x == word:
return True
if len(x) > len(word):
return False
if x[0]==word[0]:
return x_ian(x[1:], word[1:])
return x_ian(x, word[1:])
答案 1 :(得分:0)
您将获得None的返回,因为并非所有分支都返回值。两个递归调用需要返回结果。类似的东西:
return x_ian(x[1:],word[1:])
如果函数从不调用return,则python隐式返回None。
答案 2 :(得分:0)
这里,.index()
功能非常方便。字符串上的index()
函数将始终返回作为参数传入的第一个字母的索引。所以,
print 'abcdceg'.index('c')
# will return 2 - the first occurrence of 'c' in the string
利用这个,我们首先检查x [0]是否从字符串中返回索引
try:
word.index(x[0])
except:
# do something ...
如果单词中根本不存在x的第一个字母,它将进入异常。但是,如果它确实返回一个索引,我们希望从第一次出现直到该单词的结尾修剪该字符串,并在x中查找连续的字母,就像递归调用一样:
x_ian(x[1:], word[word.index(x[0]) + 1:])
现在,如果字符串没有返回索引,这意味着,可能有两种可能性,x用完字母,或者x中有一个字母中不存在的字母。所以,现在我们有例外情况:
try:
word.index(x[0])
except:
if len(x) == 0:
return True
else:
return False
全部放在一起
def x_ian(x, word):
# the .index will always return the 1st occurance's index
try:
word.index(x[0])
except:
if len(x) == 0:
# at this point, all the letters in x have been checked
# in successive order, which means, it exists.
return True
else:
# at this point, we encountered a letter in x that doesn't
# exist in word.
return False
return x_ian(x[1:], word[word.index(x[0]) + 1:])
您可以查看正在运行的代码here。