再帰処理について勉強してみました~

再帰処理って知っていますか?
プログラミングをされている方だとご存知の方も多いと思います~

簡単に言うと、「自分自身を呼び出す処理の事」ですね~
そんな関数の事を「再帰関数」ともいうそうです~

例えば、1からxまでを足す関数 add(x) を作ってみたのですが、
これは再帰関数になります~

def add(x):
    if x == 0:
        return 0
    print('x:', x)
    return x + add(x - 1)


print(add(3))

…皆さんはこれの意味分かりますか?私は最初よく分からなくて…
何故足された結果がちゃんと帰っているのか理解できてなかったのです~

という訳でうんうん唸っていたのですが、
図にしてみてやっと理解できました~

f:id:cacapon:20191004213246p:plain

上の図はadd(3)の場合の処理ですね~
まずadd(3)が呼ばれます。return の値は 3 + add(2) になりますね~
次、add(2)が呼ばれます。return の値は 2 + add(1)
次、add(1)が呼ばれます。return の値は 1 + add(0)
最後のadd(0)はif文入るので0を返します~

これが順番に戻るのですね。
add(1) return 1 + 0 で 1が返り、
add(2) return 2 + 1 で 3が返り、
add(3) return 3 + 3 で 6が返ります~
だからprintで表示されるのが6なのですね~

因みに、なんで再帰処理を勉強したのかっていうと、
パズルゲームのステージの処理に使えるなぁと思ったからです~

ドクター〇リオとかぷ〇ぷよとかテ〇リスのカスケードモードみたいに、
隙間があったらパーツが下に落ちる処理を考えていたのですが…

{
 この位置の下の段が空いているとき、
 そのパーツを下にずらず

}を最上段から最下段まで繰り返す

ということをやりたかったのです~
{}の部分が実装できれば、後は何回呼び出すかの問題になりそうですし、
そうなると、add()みたいな関数にすればよいんじゃないかと思ったんです~

今まで二重のfor文でやっててごちゃごちゃしていたのが、
少しきれいになりそうです(笑