









[blog]
[ML]
[todo]
[CVS]
[bug]
[apache log]
[swiki log]
[statistics]
[map]
[man]
[info]
[アンテナ]
再帰
Recursion
関数自身が、自分(関数)を呼ぶこと。っていうと、あまりにも大雑把
であるが、まあそういうことなのである。
昔、学校で習うような、階乗なんて、もろ再帰である。
F(x) = x × F(x-1) (ただし、xは、自然数)
で、再帰っていうのは、自然な考え方なんですが、賢くないコンパイラ
だと、そのままのアセンブラを吐き出しちゃう。
これの何が問題かっていうと、C言語の場合だと、関数をコールするたび
に、フレームポインタっていうか、スタックにレジスタ退避するでしょ。
仮に、1回の関数コールで、100byte退避する(実際は、そんなに退避
しないけど)とすると、10000回再帰で呼び出すと100×10000 = 約1MB
も退避用のメモリを必要とする。
最近のコンピュータでは、これしきはどうってことないかと思うけど、
実は、このようにデータに依存して、メモリ量が著しく増大する
ことそのものが危険なのである。
つまり、データによって、システムに脆弱性が生じるということが
危険なのである。
ただし、最近の賢いコンパイラは、ちゃんと再帰を反復に置き換える
(置き換えられる再帰である末端再帰なら。)ことができるはず
なので、よく考えて使うべし。

ツッコミ大歓迎

Links to this Page
- プログラミング的概念 last edited on 1 June 2004 at 12:41 pm
- 副作用 last edited on 31 May 2004 at 10:41 pm