PythonはNoneに戻ったのか?
2194 ワード
今日codewarで問題を作って遊んで、1題をやり遂げる時、再帰で書いてみたいと思って、関数の体内ですべて正常であることを発見して、しかし値を印刷する時、印刷した結果はNoneです.どこに問題があるのか分からないので、ネットで一周して、自分で論理全体をよく考えました.明らかになったようだ.ここで私の理解を説明します.
まず,説明のためのケースとして簡略化された再帰関数を書きます.
上のプログラムロジックは超簡単です:入力した本が1より大きいかどうかを判断して、1より大きいならそれを1減らして、それから判断します.このまま缲り返してゆく.xが1以下の場合、xのサイズが返されます.
戻ったxが印刷された結果は1ではないかと思いがちです.しかし、そうではありません.上のコードを実行して、印刷した結果は次のとおりです.
どうしてそうなの?私の理解は次のとおりです.
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)が返す値を取得しようとするプログラムを書くことができます.手順は次のとおりです.
プログラムでは,ex(x)が呼び出されるたびに返されるデータを辞書で記録した.結果は次のとおりです.
表示:反復では、後に呼び出された関数が先に返されます. 最後に呼び出された関数が正しく返された以外は、以前の関数にはreturnがなかったので、返されたのはNoneです.
では、反復されたデータをどのように正しく返すのでしょうか.答えは:1階1階で最後の呼び出しを返します.コードは次のとおりです.
結果:
どうして今度は正しいの?最初にex(x)を呼び出すと、それはex(x-1)を返し、次の呼び出しはex(x-2)を返して手を携えて渡し、最終的にex(1)returnをtに渡したので、このときt=ex(1)に等しくなり、自然に正しい結果が得られた.
ええと、本文はここで終わります.最後に、Pythonは確かに反復が好きではありません.反復の回数を厳しく制限します私のパソコンでは、反復の回数が999を超えると、次のように間違っています.
t = ex(998)
t = ex(999)
まず,説明のためのケースとして簡略化された再帰関数を書きます.
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}
表示:
では、反復されたデータをどのように正しく返すのでしょうか.答えは: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