来自edX的Python任务......再次

时间:2012-11-01 17:48:32

标签: python

这是我第二次就麻省理工学院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。

非常感谢您的帮助。

3 个答案:

答案 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