PythonはNoneに戻ったのか?

2194 ワード

今日codewarで問題を作って遊んで、1題をやり遂げる時、再帰で書いてみたいと思って、関数の体内ですべて正常であることを発見して、しかし値を印刷する時、印刷した結果はNoneです.どこに問題があるのか分からないので、ネットで一周して、自分で論理全体をよく考えました.明らかになったようだ.ここで私の理解を説明します.
まず,説明のためのケースとして簡略化された再帰関数を書きます.
def ex(x):
    if x > 1:
        x -= 1
        ex(x)
    else:
        return x

t = ex(5)
print(t)

上のプログラムロジックは超簡単です:入力した本が1より大きいかどうかを判断して、1より大きいならそれを1減らして、それから判断します.このまま缲り返してゆく.xが1以下の場合、xのサイズが返されます.
戻ったxが印刷された結果は1ではないかと思いがちです.しかし、そうではありません.上のコードを実行して、印刷した結果は次のとおりです.
None

どうしてそうなの?私の理解は次のとおりです.
t=ex(5)で関数を呼び出す.関数が直接t=1を返すと、木に問題があります.問題は、プログラムがここでデータを返すことです.逆に関数自体を呼び出した.今回呼び出されたのはex(4)で、ずっと呼び出されていたex(1)がreturnに実行された.今度は誰にreturnをあげましたか?答えは誰にもあげられなかった.t=ex(1)を設定していないため,関数のreturnから返されるデータはこのように失われる.
私たちが呼び出したt=ex(5)は、if>1が成立しているため、else:return xを直接スキップしました.今回の呼び出しに等しく、returnは使用されません.Pythonでは、関数体にreturnがない場合、そのreturnはNoneであると規定されています.つまり、私たちが上記のプログラムを実行したとき、得られた結果はNoneです.
これを証明するために、ex(1)今回の呼び出しに反復したときにex(1)が返す値を取得しようとするプログラムを書くことができます.手順は次のとおりです.
t = {}

def ex(x):
    global t
    if x > 1:
        x -= 1
        t[x] = ex(x)
    else:
        return x

ex(10)
print(t)

プログラムでは,ex(x)が呼び出されるたびに返されるデータを辞書で記録した.結果は次のとおりです.
{1: 1, 2: None, 3: None, 4: None, 5: None, 6: None, 7: None, 8: None, 9: None}

表示:
  • 反復では、後に呼び出された関数が先に返されます.
  • 最後に呼び出された関数が正しく返された以外は、以前の関数にはreturnがなかったので、返されたのはNoneです.

  • では、反復されたデータをどのように正しく返すのでしょうか.答えは:1階1階で最後の呼び出しを返します.コードは次のとおりです.
    def ex(x):
        if x > 1:
            x -= 1
            return ex(x)
        else:
            return x
    
    t = ex(5)
    print(t)
    

    結果:
    1
    

    どうして今度は正しいの?最初にex(x)を呼び出すと、それはex(x-1)を返し、次の呼び出しはex(x-2)を返して手を携えて渡し、最終的にex(1)returnをtに渡したので、このときt=ex(1)に等しくなり、自然に正しい結果が得られた.
    ええと、本文はここで終わります.最後に、Pythonは確かに反復が好きではありません.反復の回数を厳しく制限します私のパソコンでは、反復の回数が999を超えると、次のように間違っています.
    t = ex(998)
    1
    

    t = ex(999)
    Traceback (most recent call last):
    File "E:\Work\Coder\Test\test4.py", line 14, in 
    t = ex(999)
    RecursionError: maximum recursion depth exceeded in comparison