2016-08-02 6 views
2

私はこれらのコード行に関して質問があります。私はprint文が表示されるでしょうかを把握しようとしていた。Pythonの二重再帰の結果

def f(s): 
    if len(s) <= 1: 
     return s 
    return f(f(s[1:])) + s[0] 
print f("abcd") 

私は印刷にそれを期待していた:dcbaではなく、それは示した:dbcaを。

誰かが私になぜこれが起こっているのか正確に説明できたら本当に感謝します。私の目標は、dcbaを印刷する方法でコードに変更するのではなく、なぜそれが動作しているのかを理解することです。提供されたすべてのヘルプに事前に感謝します。私は正確にスタックトレースを見ることができないので、 乾杯

+0

は、むしろ無意味な変換のように見えます。このコードはどこで入手できましたか? –

+1

あなたの期待は 'return f(s [1:])+ s [0]' not f(f(s [1:]))+ s [0] 'を返します。 –

+0

各関数呼び出しとその結果を書き出します。 'f(f(s [1:]))'はまず 'f(s [1:])'を計算します。 'f'への二重呼び出しは' f'をもう一度呼び出す前に一種のシャッフルを行うので、結果は奇妙です。 – dashiell

答えて

3

ボトムアップから始めましょう。

1文字の文字列にfを呼び出すと、その文字列が返されます。 Ex。 f( "a")は "a"を返します。

2文字の文字列にfを呼び出すと、その文字列が反転します。 Ex。 f( "ab")== f(f( "b"))+ "a" == f( "b")+ "a" == "b" + "a" == "ba"

3文字の文字列にfを呼び出すと、左端の文字が右端に移動した文字列が返されます。 Ex。 f( "abc")== f(f( "bc"))+ "a" == f( "cb")+ "a" == "bc" + "a" == "bca"

4桁の文字列にfを呼び出すと、結果として得られた結果が返されます。f( "abcd")== f(f( "bcd"))+ "a" == f( "cdb" )+ "a" == "dbc" + "a" == "dbca"。

+0

これは非常に役に立ちました。ご回答有難うございます! – Python101

+0

2回目以降の段落の2番目から最後までの項は 'f"( "bc")+ "a" 'ではなく' 'bc" + "a" 'でなければなりません。 – glibdud

+0

だから、むしろf( "cb")+ "a" == "bc" + "a"右でしょうか? – Python101

1

は、私は、デバッガを通して、あなたのコードを実行していないが、それはあなたが再帰的に二回f()を呼び出すことによるものです。これは意図しない変換につながる文字列を過度に操作しているようです。あなたは再帰的に文字列を逆にしたい場合は、以下のコードはかなり人気がある:

def f(s): 
    if len(s) == 0: 
     return s 
    return f(s[1:]) + s[0] 

サンプル結果:

print f("abcd") 
>>> dcba 

言われていること(私はこれが学習運動であると仮定?) 、はるかにpythonic文字列を逆にする方法は、extended slice syntax[being:end:step]を使用することです。

print 'abcd'[::-1] 
>>> dcba 
2

あなたは電話をフォローしたい場合は、いくつかのprint文を追加します。

>>> def f(s): 
...  print 
...  print "recieved", s 
...  if len(s) <= 1: 
...   print "returning", s 
...   return s 
...  print "returning f(f(%s)) + %s" % (s[1:], s[0]) 
...  return f(f(s[1:])) + s[0] 
... 
>>> print f("abcd") 

recieved abcd 
returning f(f(bcd)) + a 

recieved bcd 
returning f(f(cd)) + b 

recieved cd 
returning f(f(d)) + c 

recieved d 
returning d 

recieved d 
returning d 

recieved dc 
returning f(f(c)) + d 

recieved c 
returning c 

recieved c 
returning c 

recieved cdb 
returning f(f(db)) + c 

recieved db 
returning f(f(b)) + d 

recieved b 
returning b 

recieved b 
returning b 

recieved bd 
returning f(f(d)) + b 

recieved d 
returning d 

recieved d 
returning d 
dbca