Sodech Developer Blog

株式会社ソデック技術ブログ

再帰呼び出し(リカーシブ・コール)って知ってますか?

What's a recursive call?

こんにちは。

コロナに罹患し、週末の自宅療養中にふと昔のエンジニア時代の事を思い出し、そうだブログを書こうと思い立った昔のエンジニアです。

皆さんは、色々なプログラミング言語で使える関数や method の再帰呼び出しって知っていますか?

システムのパフォーマンスに影響を与える可能性があるので乱用はお勧めできませんが、知っていると便利な事も多いと思いますので、興味がある方は是非続きを読んでください。

再帰呼び出し(リカーシブ・コール)とは?

プログラムの中で、関数や method が自分自身を呼び出す事を再帰呼び出しと言います。何言っているのかさっぱりわからんという方もいると思いますが、もうちょっと我慢してください。

int function(){
      ......
      function();
      .....
}
上記の例の用に、関数function の中で自分自身の関数functionを呼び出す事が再帰呼び出しです。

再帰呼び出しってどんな時に役立つの?

話は少し変わりますが、皆さんは「回文」ってご存じですか?

「回文」とは、最初から読んでも、最後から読んでも同じ言葉になる文です。有名なところだと「たけやぶやけた」などでしょうか。

ある文が回文かどうか判定する関数を例にして、再帰呼び出しの有効性を考えてみます。

まず、回文かどうか判定するにはどうしたら良いかを考えます。「回文」とは、最初から読んでも、最後から読んでも同じ言葉になる文なので、最初の文字と最後の文字が同じである必要があります。この条件だけで再帰呼び出しを行って回文判定する事が出来ます。

回文確認
boolean 回文確認(確認文){
   if (確認文の文字数が1または0){
      return 真;
   }
   if (確認文の最初の文字と最後の文字が同じ) {
      return 回文確認(確認文から最初と最後の一文字を除いた文);
   }
   else {
      retrun 偽;
   }
}

では、「たけやぶやけた」が回文かどうか、上記の仮コードで確認してみましょう。

仮コードのボールドの部分が再帰呼び出しになっています。

回文確認(たけやぶやけた

2文字以上で最初と最後の文字が同じなので

 回文確認(けやぶやけ)を再帰呼び出し

 2文字以上で最初と最後の文字が同じなので

  回文確認(やぶや)を再帰呼び出し

  2文字以上で最初と最後の文字が同じなので

   回文確認()を再帰呼び出し

   1文字なので「真」をリターン

  回文確認(やぶや)は回文確認(ぶ)の「真」をそのままリターン

 回文確認(けやぶやけ)は回文確認(やぶや)の「真」をそのままリターン

回文確認(たけやぶやけた)は、回文確認(けやぶやけ)の「真」をそのままリターン

よって「たけやぶやけた」は回文である(真である)と判定されました。

このように同じ関数に与える引数を変えながら再帰呼び出しを行うことで、プログラムをシンプルにする事ができます。

まとめ

再帰呼び出しを理解しいつでも使えるようになっていると役立つ時がきっとあると思います。是非、機会があったら挑戦してみてください。

ただし、最初にも書きましたが再帰呼び出しには注意点がありますので、そこだけは忘れないでください。再帰呼び出しが行われると、その関数やMethodでそこまで実行されていた状態は一旦メモリへ格納されます。そして、再帰呼び出しが完了した時点で、メモリに格納された以前の実行状態を呼び出して、状態を復元させて処理を継続します。よって、再帰呼び出しが深くなるほどメモリー領域を消費することになります。このため、Salesforce の Apex では、再帰呼び出しの深さに制限が設けられています。(この制限があると、再帰呼び出しが使用出来る場面はかなり限定的になると思います。)

この辺りを説明をしようとするとブログではなかなか難しいので、興味がある方はご自分で勉強してみてください。

Rome was not built in a day.

Stay healthy!