再帰関数 超むずい。
ファミマの焼き鳥 超うまい。(食べたことないけど)
というわけで、再帰関数について勉強中であります。
今まで、縁がなかったんですよ。作る必要なかったっていうか。
しかし、ディープラーニング系だと結構出てきますよね!
こちらのサイト拝見して勉強させて頂きました。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君が教えてくれました。
「再帰関数は、枝分かれしていって評価するんですが、最後の枝までいったら逆順に評価していくんです。」
エッッ そうなんだ。( ゚Д゚) むずかしー!!
サイキッカーへの道は遠いようです。