0

アルファベット順の文字列を取り、その文字列内の特定の文字を検索するプログラムを作成しようとしています。真ん中の文字より半分大きい。

次のコードを試してみましたが、エラーが発生しました:

cannot concatenate 'str' and 'int' objects.|

文字列を半分に切り、正しい半分をプログラムに返して、文字を再度検索しようとしています。たとえば、キャラクターが真ん中のキャラクターより小さかった場合、右半分を捨て、左半分を返し、その真ん中を見つける必要があります。以下は、プログラムがハングするコード サンプルです。理由を教えてもらえますか?return isInF(char, aStr[:middle])

def isIn(char, aStr):

    def toChars(aStr):
        s = aStr.lower()
        ans = ''
        for c in s:
            if c in 'abcdefghijklmnopqrstuvwxyz':
                ans = ans + c
        return ans

    def isInF(aStr):
        if len(aStr) == 0:
            return False
        elif len(aStr) == 1:
            if char == aStr:
                return True
            else:
                return False
        elif len(aStr)> 1:
            length = len(aStr)
            middle = aStr[((length-1)/2)]
            if char == middle:
                return True
            elif char < middle:
                return isInF(char, aStr[:middle])
            elif char > middle:
                return isInF(char, aStr[middle+1:])
    return isInF(toChars(aStr))


isIn ('c', 'aaaabbbbc')
4

2 に答える 2

1

なぜ単純にこれをしないのですか?

char in aStr

投稿したコードにはいくつかの問題があります。たとえばisInF(char, aStr[middle])isInF引数は 1 つしか取りません。ただし、問題は次のとおりです。

...
middle = aStr[((length-1)/2)]
...
return isInF(char, aStr[middle+1:])

middleの途中から文字を返し、文字aStr列です。次に、それに追加しようとし1ますが、明らかに失敗します。middle真ん中の文字ではなく、文字列の真ん中の場所を意味していると思われるので、その行は次のようになります。

middle = (length-1) / 2
于 2015-01-30T11:47:18.397 に答える
0

コードの動作バージョンは次のとおりです。

def isIn(char, aStr):

    def toChars(aStr):
        s = aStr.lower()
        ans = ''
        for c in s:
            if c in 'abcdefghijklmnopqrstuvwxyz':
                ans = ans + c
        return ans

    def isInF(aStr):
        length = len(aStr) # call len() once will ok 

        if length == 0:
            return False
        elif length == 1:
            if char == aStr:
                return True
            else:
                return False
        elif length > 1:

            middle = (length-1)/2
            try:

              if char == aStr[middle]:
                  return True
              elif char < aStr[middle]:
                  return isIn(char, aStr[:middle])
              elif char > aStr[middle]:
                  # print aStr[:middle]
                  return isIn(char, aStr[middle+1:])
            except Exception, error:
                print error

    return isInF(toChars(aStr))


print isIn ('c', 'aaaabbbbc')

あなたのバグはここにあります

middle = aStr[((length-1)/2)]

middle は char であるため、aStr を middle でインデックス付けしますが、ここでは:

isInF(char, aStr[:middle])

aStr を middle で再度インデックス付けしますが、これは char であるため、エラーが発生します。

コードの私のリワークバージョンは次のとおりです。

import string

def isIn(char, aStr):

    def toChars(aStr):
        lower_str = aStr.lower()
        return ''.join([i for i in aStr if i in string.lowercase])

    def isInF(aStr):
        length = len(aStr) # call len() once will ok 

        if length == 0:
            return False
        elif length == 1:
            return True if char == aStr else False
        elif length > 1:

            middle = (length-1)/2
            if char == aStr[middle]:
                return True
            elif char < aStr[middle]:
                return isIn(char, aStr[:middle])
            elif char > aStr[middle]:
                return isIn(char, aStr[middle+1:])

    return isInF(toChars(aStr))

print isIn('c','abcdef')
print isIn('x','abcdef')
于 2015-01-30T12:03:02.820 に答える