2
def function(s):
 if len(s) == 1:
    print s[0],
 else:
    function(s[1:])
    print s[0],

function("1234")印刷してしまう4 3 2 1

なぜこれが起こるのですか?関数では、明らかに最初の条件が満たされていません。else条件でs[1:]は、はsに入れられますが、その長さは1ではありませんs[0]。画面に外部のものがどのように印刷されるかがわかりません。その関数には、逆は言うまでもなく、印刷するように見えるものは何もありませんs[1:]。私はかなり混乱しています。

4

4 に答える 4

9
>>> def function(s):
...     print 's is currently %r' % s
...     if len(s) == 1:
...         print s[0],
...     else:
...         function(s[1:])
...         print s[0],
... 
>>> function("1234")
s is currently '1234'
s is currently '234'
s is currently '34'
s is currently '4'
4 3 2 1

これは再帰関数であり、s [0]を出力する前に再度呼び出すため、出力される項目は逆になります。

これがもっと役立つかもしれない例です。

>>> def function(s):
...     print 's is currently %r' % s
...     if len(s) > 1:
...         print 'calling function again with %r as s' % s[1:]
...         function(s[1:])
...     print s[0],
... 
>>> function('1234')
s is currently '1234'
calling function again with '234' as s
s is currently '234'
calling function again with '34' as s
s is currently '34'
calling function again with '4' as s
s is currently '4'
4 3 2 1
于 2012-04-20T03:10:59.907 に答える
1

これは再帰の場合です。長さ1(元の入力の最後の文字列)の文字列になるまで、元の入力の短い部分文字列を使用して関数自体を何度も呼び出します。この場合、関数は印刷を開始します。次に、文字列の残りの部分を「巻き戻し」て逆に印刷します。

この注釈付きコードを見てください:

def function(s):
    if len(s) == 1:
        print 'single:', s[0],  # (A) this is where your first output is generated for a single character
    else:
        print 'calling function again with ',s[1:]
        function(s[1:]) # (B) you call function again, i.e., your recursive call
        print ' unwind->', s[0], # (C) the "unwinding" step, i.e, finish the rest
                                 # of the function when you return from the recursive call

取得する出力は次のとおりです。

calling function again with 234
calling function again with 34
calling function again with 4
single: 4  unwind-> 3  unwind-> 2  unwind-> 1

初めて関数を呼び出すときは、else句にドロップスルーし、行(B)で関数を再度呼び出しますが、今回は「234」を使用します。これで関数が再び開始されますが、「234」でもう一度ドロップスルーしてelse関数を呼び出しますが、「34」で関数が再び実行され、もう一度ドロップスルーしてelse「4」で関数を呼び出します。 "..今回は長さが1なので、印刷します(行A)。

ここで、この関数(巻き戻しプロセス)から戻り、再帰呼び出しを行う前の時点から再開し、現在の残りの文字の最初の文字を印刷して、文字列の残りの部分を逆に印刷します(行C) 。

再帰に最初に遭遇したとき、再帰を把握するのは難しい場合があります。これは完全に正常なことです。ある時点でクリックして明確になります。一般的な概念について読んで、明確な注釈付きの例を検索することをお勧めします(ほとんどのCS /プログラミングの本にはいくつかあります)。

これは、Pythonでの再帰を簡単な例で説明する短いYouTubeビデオです。役立つことを願っています:http ://www.youtube.com/watch?v = 72hal4Cp_2I

于 2012-04-20T03:10:04.710 に答える
1

次のように関数を変更してみてください。

def function(s):
   print 'Called with {}'.format(s)
   if len(s) == 1:
      print s[0]
   else:
      function(s[1:])
      print s[0]

そしてそれを実行します。function(s[1:])ヒットするたびに、その「実行」を一時停止し、一時的に一時停止されたものの内部でfunction()新しい実行を開始していることがわかります。function()への新しい呼び出しfunction()は、文字列の短縮バージョンを使用します。最終的には、1つの文字だけで呼び出され、最初の条件に到達します。

内部から関数を呼び出すことを再帰と呼びます。

于 2012-04-20T03:13:45.957 に答える
0

作業中の再帰を見てみましょう。

  • まず、s="1234"で関数を呼び出します
  • len(s)= 4なので、他の人を連れて行きます
  • または「234」 を使用して関数を再帰的に呼び出しますs[1:]
    • これで、s="234"で機能しています。
    • len(s)= 3なので、他の人を連れて行きます
    • s[1:]または「34」 を使用して関数を再帰的に呼び出します
      • これで、s="34"で機能しています。
      • len(s)= 2なので、他の人を連れて行きます
      • s[1:]または「34」 を使用して関数を再帰的に呼び出します
        • 今、あなたはs4"で機能しています
        • len(s)= 1なので、ifとprintの最初の部分を実行します。s[0]つまり4
        • あなたが戻る
      • 前の呼び出し(s = "34")に戻ると、印刷s[0]します。つまり、3
      • あなたが戻る
    • 前の呼び出し(s = "234")に戻ると、印刷s[0]します。つまり、2
    • あなたが戻る
  • C前の呼び出し(s = "1234")に戻ると、印刷s[0]します。つまり、1
  • あなたが戻る
于 2012-04-20T03:18:46.927 に答える