Python 再帰関数 初めの一歩

再帰関数 超むずい。

ファミマの焼き鳥 超うまい。(食べたことないけど)

というわけで、再帰関数について勉強中であります。

 

今まで、縁がなかったんですよ。作る必要なかったっていうか。

しかし、ディープラーニング系だと結構出てきますよね!

こちらのサイト拝見して勉強させて頂きました。m(_ _)m

http://www.geocities.jp/m_hiroi/light/pyalgo01.html

とりあえず、ここに載っているフィボナッチ関数の簡単なバージョンを作ってみます。

def fibo(n):

    print('nだよ %s' %n)
    if n == 0 or n == 1: return 1

    return fibo(n - 1) + n

v=fibo(5)
print('vだよ %s' %v)

結果は次の通り。

nだよ 5
nだよ 4
nだよ 3
nだよ 2
nだよ 1
vだよ 15

再帰関数初心者としては、return が最後しか返ってこないのが不思議。

弊社の俊英 Nくんが教えてくれたのですが、
「まずは再帰の中をぐるぐるやって、終わった時にreturnします。」
だそうです。

もうちょっと飛躍させて、次のようなのを作ります。

print('はじまり')
array = [1,2,3]

def search(s):

    print("sだよ %s" %s)

    if s not in array:

        v = s + 10
        print("途中で帰るv %s" % v)
        return -v

    next_s = s + 1

    v = search(next_s)

    print('最後まで行ったv:%s s:%s' %(v,s))

    return -v

for x in range(5):
    value = search(x)
    print("vだよ %s" %value)

print('おわり')

出力は次の通り。

はじまり

sだよ 0
途中で帰るv 10
vだよ -10
sだよ 1
sだよ 2
sだよ 3
sだよ 4
途中で帰るv 14
最後まで行ったv:-14 s:3
最後まで行ったv:14 s:2
最後まで行ったv:-14 s:1
vだよ 14
sだよ 2
sだよ 3
sだよ 4
途中で帰るv 14
最後まで行ったv:-14 s:3
最後まで行ったv:14 s:2
vだよ -14
sだよ 3
sだよ 4
途中で帰るv 14
最後まで行ったv:-14 s:3
vだよ 14
sだよ 4
途中で帰るv 14
vだよ -14

おわり

最後まで行ったv というのが結局returnされないのは、さっきのくだりで学習したのですが、初心者にとって解せぬポイントは

最後まで行ったv:-14 s:3
最後まで行ったv:14 s:2
最後まで行ったv:-14 s:1

なんですよ。

なんで、これ、sの順番が逆なの??
sは 1,2,3 の順じゃないの??

これも、弊社の俊英かつサイキッカーのN君が教えてくれました。

「再帰関数は、枝分かれしていって評価するんですが、最後の枝までいったら逆順に評価していくんです。」

エッッ そうなんだ。( ゚Д゚) むずかしー!!

サイキッカーへの道は遠いようです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です