2

私はまだ再帰を理解しようとしており、コードが出力することを期待していたものと実際に出力したものは異なります。

これは、YouTubeで見つけた簡単な例に基づいたコードです。

def count(n):
    if n > 0:
        print "Count 1", ", ", n

        count(n - 1)

        print "Count 2", ", ", n
    else:
        print "Done"

count(1)

そして、これはそれが印刷するものです、

カウント 1 , 1

終わり

カウント 2 , 1

私が期待していたのは

カウント 1 , 1

終わり

終わり

私の理解 (もちろん間違っています) は、count(1) (外側のカウント関数の場合) が呼び出され、1 が 0 より大きいため 1 が出力され、次に count(1 - 1) (内側のカウント関数) が呼び出されるということです。 count(0) ( outer count function ) であり、0 は 1 より大きくないため、Done が出力されます。次に、count(1 - 1) (内部カウント関数) からの戻り値も Done を返すと考えました。これは、内部 count() に入力された他の n 値がなかったためです。1回の印刷と1回の印刷が2回行われる方法がわかりませんか???

4

7 に答える 7

7

の入力に対して関数を手で見てみましょう1:

  • count(1)と呼ばれる (n1):
    • n > 0trueなので (if 節):
      • 印刷Count 1 , 1(ここにnあるので1
      • count(0)と呼ばれる (n0):
        • n > 0falseなので (else 節):
          • 印刷するDone
      • 印刷Count 2 , 1(ここにnあるので1

ご覧のとおり、一度doneだけ印刷されます。この種のジレンマに直面したときは、古い鉛筆とメモ帳を取り出して、何が起こっているのかを正確に手で追跡することが非常に役立つことがよくあります。

また、最初の 2 つの print ステートメントを削除して、関数の単純化されたバージョンについて考えることもできます。これは、出力回数"Done"に影響を与えるべきではないためです。

def count(n):
    if n > 0:
        count(n - 1)
    else:
        print "Done"

"Done"これで、一度だけ印刷されることがより明確になるはずです。

  • count(1)と呼ばれる (n1):
    • n > 0trueなので (if 節):
      • count(0)と呼ばれる (n0):
        • n > 0falseなので (else 節):
          • 印刷するDone
于 2013-09-19T01:08:55.093 に答える
2

count 関数を簡単に拡張して、実際に何が起こっているかを見てみましょう。

def count0:
    print "Done"

def count1:
    print "Count 1, 1"
    count0()
    print "Count 2, 1"

ご覧のとおりcount1(実際count(n)には n > 0 の場合は any) は決して出力されません"Done"。したがって、印刷されるのは一度だけです。

于 2013-09-19T01:08:33.820 に答える
1

あなたが間違っているのは、count(n-1) の戻り値で何も起こらないことだと思います。

n=1 で count を最初に呼び出すと、"Count 1,1" が出力され、次に count(0) が呼び出されます。この呼び出しでは n=0 であるため、「Done」と出力して戻ります。count(0) を呼び出した直後に、count(1) に戻ります。次に、n がまだ 1 であるため、"Count 2, 1" を出力する次のステートメントを実行します。これで完了です。

于 2013-09-19T01:16:48.340 に答える
0

n <= 0 の場合、else ブロックの print "Done" は count の呼び出しでのみ発生するためです。n = 1 の最初の呼び出しでは、このステートメントは実行されず、2 回目の再帰呼び出しでのみ実行されます。 n は 0 です。

于 2013-09-19T01:08:18.970 に答える
0

最初の行を出力した後、Count 1, 1

n が 0 になり、if 条件が失敗するため、Done を出力するメソッドを呼び出します。

その後、メソッドを呼び出したメソッドに戻り、次の行に移動します

n はその値を変更していないため、これは print Count 2, 1 です (n = n-1 を設定すると、n は 0 になります)。

于 2013-09-19T01:08:45.643 に答える