のように書くことができ、また、あなたがループ内のprint文を追加することができますし、何が起こっているか見ることができるだろう
さて、超シンプルな関数を見てみましょう。私はx = super_simple_function()
を行う際
def super_simple_function():
return 0
はどうなりますか?関数の戻り値値はゼロですのでです
>>> x = super_simple_function()
>>> x
0
。したがって関数オブジェクトがあり、呼び出されると値が返されます(返されます)。
あなたの再帰関数を行ごとに見てみましょう。 2と3を引数として渡したとしましょう(slowAdd(2, 3)
)。
1行目:def slowAdd(m, n)
これは、最初の引数がm
と第二、n
に等しいことを意味します。従って、我々の場合、m = 2
とn = 3
。
2行目:if n == 0
これはn equals to 0
トリガ条件です。さて、今はn = 3
なので、この条件は無視されます。
3行目:return m
n
は0に等しい、このラインは、今では無視されていませんので。私たちはそれに戻ってきます。
4行& 5:else: return 1 + slowAdd(m, n-1)
ここで起こって三つのことがあります。
- 戻り値は
slowAdd(m, n-1)
です。
- 戻り値に1を加えます。
- #2から合計を返します。
この関数は、#1のために再帰的と呼ばれます。あなたが想像することができるように、この関数はn == 0
までそれ自身を呼び出し続けます。その時点で1 + slowAdd(m, n-1)
の代わりにm
を返します。
1st recursion: return 1 + slowAdd(2, 2)
2nd recursion: return 1 + slowAdd(2, 1)
3rd recursion: return 1 + slowAdd(2,0)
4th recursion: return 2 # n is finally 0!
:我々はすべての再帰に1による
n
をデクリメントしているためと、私たちは
n
が0
に最終的に等しいので、これは我々が引数として(2, 3)
を渡すときに、関数が何をしているのか、基本的であるだろうことを確かに知って
これは2 + 1 + 1 + 1 = 5
になります。
"定義された関数の値"ではなく、*関数呼び出し*の戻り値*です。それはあなたを助けますか? –
'slowAdd(m、n-1)'によって*返されたものを追加しています。したがって、 'def f(n):return 8 - n'を実行し、' 1 + f(1) 'を実行した場合、8を得ます。 –
再帰に関するWikipediaのエントリを読んでください。 – Barmar