0

MIT edXクラスのタスクに関してあなたに助けを求めるのはこれが2回目です。

タスクは次のとおりです。e、r、i、および c という文字がこの順序で含まれている単語は、erician と見なされます。たとえば、「メリトクラシー」、「ジェネリック」、「デリック」、「ユーフォリック」、「異端者」、「エレクトリック」などの単語は、それぞれ正しい順序でこれらの 4 つの文字が含まれているため、エリシア語であると言えます。「rice」という単語は、4 つの文字が間違った順序で表示されるため、erician ではありません。

この問題では、x のすべての文字が x に現れる順序と同じ順序で word に含まれている場合に True を返す、x_ian(x, word) というより一般化された関数を作成してください。

この関数は再帰的でなければなりません! この問題を解決するためにループ (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:])

現在、関数が True または False ではなく None を返す理由がわかりません。これについて IDLE でデバッガーを使用しましたが、' main '.x_ian().line49: return True で実行を終了します。

それでも関数は None を返します。

どんな助けにも感謝します。

4

3 に答える 3

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:])
于 2012-11-01T17:50:21.627 に答える
0

すべてのブランチが値を返すわけではないため、Noneが返されます。2つの再帰呼び出しは、結果を返す必要があります。何かのようなもの:

return x_ian(x[1:],word[1:])

関数がreturnを呼び出さない場合、pythonは暗黙的にNoneを返します。

于 2012-11-01T17:53:30.147 に答える
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 に含まれている可能性が 2 つあります。したがって、例外ケースがあります。

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:])

実行中のコードはこちらで確認できます。

于 2015-08-09T19:23:02.147 に答える