seegongsik
単語帳
プログラミング

自分を呼ぶ関数、再帰

関数はほかの関数を呼ぶと言いましたね(9話)。 では、関数が自分自身を呼んだら、 どんなことが起きるでしょう。 鏡を二つ向かい合わせに立てたように、 中に同じものが続けて入っています。

01

自分を呼ぶ関数

9話で、関数は仕事をまとめて名前をつけたものでした。
その中で、ほかの関数を呼ぶこともできましたね。
再帰は、そこからもう一歩すすみます。
関数が、自分自身をもう一度呼ぶのです。
鏡の中の鏡のように、同じものが一枚ふかく生まれます。

深さ 0

押してみて。押すたびに、中に同じわくが一枚ずつふえます。

ふしぎですが、少しこわくもあります。
こうやって自分を呼び続けたら、
永遠にとまらないのでは?
そのとおり。だから再帰には、ぜったい必要なものが一つあります。

02

とまる所が必要です

鏡二つは本当にきりなく入っていきますが、
コンピューターは「永遠に」ができません。
だから、ルールを一つ決めます。
「かけらが十分に小さくなったら、そこでとまれ。」
このとまるルールがないと、永遠に回ってくずれます。

3

とまるルールをつけると3、2、1でぴたっと止まります。消すと、きりなく下がってくずれます。

このとまる場所を「ゆか」と思うとかんたんです。
ゆかにつくまでは自分を呼び続け、
ゆかにつくと、もう呼びません。
では、どう分けるかが大事になります。

03

同じ問題の小さい版

再帰の本当のコツはこれです。
大きな問題を「一歩 + 同じだけど小さい問題」と見るのです。
階段ぜんたい = 一だん + のこりの階段。
「のこりの階段」も同じ問題、一だん小さいだけ。
小さく小さくなって、0だんにつけば終わりです。

のこりの階だん 5

一だんずつはがしてみて。のこりは毎回「同じだけど小さい」問題です。

むずかしかった問題が、急にかんたんになります。
ぜんぶを一度にとく必要はありません。
「一だん」だけ片づけて、のこりは同じ関数にまたまかせればいいのです。
では、まかせた仕事は、どうもどってくるのでしょう?

04

行って、またもどる

再帰は二つの方向に動きます。
まずゆかまでずっと下ります(自分を呼んで、また呼んで)。
ゆかについたら、今度は逆にもどりながら、
それぞれが自分のぶんをたします。
お皿をつみ上げて、上からまたかたづけるのと同じです。

sum(3)
下りているところ

一歩ずつ押してみて。1+2+3をゆかまで下りて、もどりながら6に集めます。

この「下りてのぼる」が再帰の心臓です。
下りるときは問題を分け、
のぼるときは答えを合わせます。
つみ上がった仕事が、ゆかから順にほどけていきます。

05

くりかえしの兄弟、その先へ

再帰とくりかえし(7話)は兄弟です。
どちらも「同じことを何回も」しますが、
くりかえしは横にずらりとならべ、
再帰は中へ一枚ずつもぐっていきます。
フォルダの中のフォルダのように、枝からまた枝が出ることには、再帰がぴったりです。

深さ 1

一回押すと、枝がまた分かれます。同じルールが、ひとりでに木をえがきます。

まとめて名前をつけた関数が(9話)、
いまや自分自身まで呼べるようになりました。
小さく分け、ゆかでとまり、また集める。
この一つの考えが、フォルダ、コメントへのコメント、めいろ解きまでときます。
次は、いくつもの値を組にしてしまう方法へ進みます。

一言でいうと再帰は、関数が自分自身を呼ぶことです。大きな問題を「同じ問題の小さい版」に分け、とまる所にとどいたら、また上へもどりながら答えを集めます。
プログラミング
このページがお役に立ったなら支援する