0

これは私の簡単なコードです。

def reverseString(aStr):
    newStr = ''
    if len(aStr) == 0:
        return newStr
    else:
        newStr = newStr + aStr[len(aStr)-1]
        return reverseString(aStr[:len(aStr)-1])

(前'alina'に挿入した場合)の場合、出力は次のとおりです。理解できません。なぜこのように振る舞うのですか?print newStrreturn reverseString...newStr='a'newStr='n'newStr='i'newStr='l'newStr='a'newStr=''

4

4 に答える 4

3

関数が機能しなかった理由は、最後に戻るのを忘れたためですnewStr。そして、関数を呼び出すたびに、newStrにリセットされ''ます。

あなたがしていることをもっと簡単に行う方法があります。スライスを使用します:

def reverseString(s):
    return s[::-1]

例:

>>> reverseString('alina')
'anila'

>>> reverseString('racecar')
'racecar' # See what I did there ;)
于 2013-06-10T11:40:29.513 に答える
0

このようなもの:

def reverseString(aStr, newStr = ''):
    if len(aStr) == 0:
        return newStr
    else:
        newStr = newStr + aStr[-1]  #-1 returns the last element from the string
        return reverseString(aStr[:-1], newStr) #slice the string up to second last char
print reverseString("foobar")     
#raboof

コードの問題はnewStr、各再帰ループで空の string( ) に再割り当てされることです。すべての再帰呼び出しで値を''渡す必要があります。newStr

def reverseString(aStr, newStr= ''): #define a default value for newStr

    if len(aStr) == 0:
        return newStr
    else:
        newStr = newStr + aStr[len(aStr)-1]  #better use aStr[-1]
        return reverseString(aStr[:len(aStr)-1], newStr) #pass the new value of newStr

print reverseString("foobar")# No value is passed for newStr. So, default is used . 
于 2013-06-10T11:28:20.510 に答える
-1

以前の呼び出しからの情報を保持せずに、再帰呼び出しの結果を返しています。次の行があります。

newStr = newStr + aStr[len(aStr)-1]

しかし、その後 newStr は破棄されます。

考えられる解決策:

def reverseString(aStr):
    if len(aStr) == 0:
        return ''
    else:
        return aStr[-1] + reverseString(aStr[:-1])

または単に

def reverseString(s):
    return s[-1]+reverseString(s[:-1]) if s else ''

これらのソリューションはどちらも洗練されていますが、「通常の」再帰であるため、最適ではないことに注意してください。末尾再帰ソリューション (ループに最適化できる可能性がある) については、@Ashwini Chaudhary の回答を参照してください。

于 2013-06-10T11:28:23.260 に答える
-1

簡単に言うと、これを行うには、再帰とそれに伴う問題を回避する簡単な方法があります。

>>> ''.join(reversed("abcd"))
'dcba'
于 2013-06-10T11:56:18.700 に答える