2016-11-26 15 views
1

このコードは、文字列を取り、文字が何もない( "aa"、 "bb"、 "55"などはありません)文字列を返します。再帰を介して動作します:関数はそれ自身を呼び出し、繰り返しがなくなるまで文字列を洗練しますが、元の文字列を返します。ないあなたの戻り値が間違ってインデントを持っており、あなたがのreturnを割り当てていない、あなたのインデントが正しければ私に。よろしくお願いします。(タイトルの書式「ハッキング」して申し訳ありません)p関数の再帰とスコープに関する問題(Python)

def removeRepetitions(s): 
    result="" 
    for i in range(len(s)-1): 
     if len(s)!=1 and s[i]==s[i+1]: 
      result=s[:i+1]+s[i+2:] 
      removeRepetitions(result) 
      return result 

答えて

1

あなたの再帰関数。また、01を割り当てる必要があります〜s最初は空文字列ではありません。お使いの端末の場合はsで単一の文字を返す必要があり:

def removeRepetitions(s): 
    result = s 
    for i in range(len(s)-1): 
     if len(s)!=1 and s[i]==s[i+1]: 
      result = removeRepetitions(s[:i+1]+s[i+2:]) 
    return result 

>>> removeRepetitions('Mississippi') 
'Misisipi' 

をしかし、あなたは、再帰と反復の溶液を混合しているように見える、多くの再帰的な解決策はforループ必要としない:

def removeRepetitions(s): 
    if len(s) <= 1: 
     return s 
    c, s = s[0], removeRepetitions(s[1:]) 
    if c == s[0]: 
     return s 
    return c+s 

>>> removeRepetitions('Mississippi') 
'Misisipi' 
1

あなたが欠けている主なものは、すべての可能性をカバーするためのリターンステートメントです。中間変数resultも必要ありません。インデントを修正した後:

def removeRepetitions(s): 
    for i in range(len(s) - 1): 
     if s[i] == s[i+1]: # found a dup! 
      # Assemble a return value by taking everything prior to the 
      # duplicate (which is duplicate free) and concatenating the 
      # result of removing duplicates from the remainder of the 
      # input string, excluding the first of the duplicated chars 
      return s[:i] + removeRepetitions(s[i+1:]) 
    return s # return input string if we made it through w/o any duplicates 

print(removeRepetitions("aaaabccdddeee")) # => "abcde" 

はまた、最終的なreturn文で、len(s)!=1をチェックする余分であることに注意してください。

関連する問題