Cプログラムにおける再帰関数の補助空間とは?
はじめに
本記事では、C言語における再帰関数の呼び出しに必要な補助空間(オーバーヘッド)について解説します。さらに、通常の関数呼び出しと比較して、どのような違いがあるのかを見ていきましょう。
再帰関数の例
まず、以下のような階乗を求める関数を考えてみます。
long fact(int n){
if(n == 0 || n == 1)
return 1;
return n * fact(n-1);
}この fact() 関数は、自分自身を呼び出しているため再帰関数です。
再帰呼び出し時のスタックの動き
この関数を fact(5) のように呼び出すと、各呼び出しの戻り先アドレスがスタック上に次々と積まれていきます。
fact(5) --->
fact(4) --->
fact(3) --->
fact(2) --->
fact(1)
再帰関数は自分自身を何度も呼び出すため、呼び出しごとに新しいスタックフレーム(戻り先アドレスやローカル変数など)がスタックに追加されます。その結果、関数が n 回再帰的に呼び出された場合、補助空間は O(n) 必要になります。
通常の関数呼び出しとの違い
ここで注意したいのは、「同じ関数を n 回呼び出せば必ず O(n) の空間が必要になる」というわけではない点です。
通常の関数の場合、呼び出し時には一時的にアドレスがスタックへプッシュされますが、処理が完了するとすぐにそのアドレスはスタックからポップされ、呼び出し元の関数へ制御が戻ります。その後、次の呼び出しが行われるため、いずれの時点でもスタック上には1つ分のフレームしか存在しません。
この仕組みにより、通常の関数呼び出しを繰り返しても補助空間は常に一定であり、O(1) で済みます。
まとめ
- 再帰関数:呼び出しごとにスタックフレームが残るため、n 回の再帰で補助空間は O(n)
- 通常の関数:完了ごとにスタックから解放されるため、繰り返し呼び出しても補助空間は O(1)
再帰を使う場合は、深い再帰によってスタックオーバーフローが発生する可能性もあるため、再帰の深さとメモリ使用量には十分注意しましょう。
-
Bashシェル関数入門:実用的な6つのサンプル例で学ぶチュートリアル
Bashシェル関数とは、複数のUNIX/Linuxコマンドをひとつの名前でグループ化し、後からまとめて実行できるようにする仕組みです。Bashシェル関数は通常のUnixコマンドと同じように呼び出すことができ、現在のシェルコンテキスト内で実行されるため、解釈用の新しいプロセスを生成する必要がありません。bashのエイリアス(alias)と関数はどちらも、長いコマンドや複雑なコマンドに対するショートカットを定義するのに役立ちます。しかし、エイリアスでは制御フローや引数の扱いなど、関数ならではの高度な処理を行うことはできません。本記事では、その違いも含めて詳しく解説していきます。この記事は、進行中の
-
Excelのデータベース関数とは?12種類の使い方を実例付きでわかりやすく解説
この記事では、Excelのデータベース関数の使い方を詳しく解説します。Excelには12種類のデータベース関数が用意されており、それぞれの適用方法を一つずつ紹介していきます。まずは記事全体の概要を以下の画像でご確認ください。記事を最後まで読めば、すべての関数の使い方を習得できます。 練習用ワークブックは、下のダウンロードボタンから入手できます。 Excelのデータベース関数の基礎知識 Excelのデータベース関数を使うと、特定のデータベース(リスト)に対して合計、積、平均などの基本的な計算を簡単に実行できます。データベース関数は全部で12種類あり、DSUM、DAVERAGE、DCOUNT、D