|
> > よくある Fibonacci 数列の例もこんな感じですが、非効率を極めた感じ。
> > Ackermann 関数みたいですね。
>
> これの意味が分かりません。無駄が多いってことでしょうか?
> # 帰納的関数うんぬんは勉強不足のため現在理解できません… orz
Fibonacci 数列の定義に関しては、ググってもらっているとして、
よくこんな関数で書かれています。
int Fibonacci(int n) {
if (n == 1 || n == 2)
return 1;
else
return Fibonacci(n - 2) + Fibonacci(n - 1);
}
Fibonacchi(10) == 55 ですが、この値を計算するために、
Fibonacchi(1) と Fibonacchi(2) が、合わせて55回呼ばれています。
普通に人が計算するなら、1,1,2,3,5,8,13,21,34,55 と順に計算すれば
10回程度の足し算で計算できるのに、わざわざ再帰関数を
使っているのが無駄ということです。
数列の定義が再帰的(≒帰納的)だからといって、再帰関数の例題に
されているのが良くなく、素数探索と同様、再帰関数の良くない使いかた
だと思います。素数ほどひどいとは思いませんが。
Ackermann 関数も再帰的に定義されていますが、小さな引数で
再帰の回数が爆発的に増えるのが特徴です。
この特徴を生かしてコンピュータの性能試験に使うとか読んだことが
ありますが、他には用途はあるのでしょうか?
> # 褒め言葉 ですよね…
手放しで絶賛です。
再帰関数の有効な使いかたの学習の為に良いと思うのが、以下のHP。
人によってはパズルを解くという用途を"有効"とはみなさないかもしれませんが。
http://www.pro.or.jp/%7Efuji/index.html
http://www.pro.or.jp/%7Efuji/puzzlestudy/recursive/index.html
http://www.ic-net.or.jp/home/takaken/index.html
http://www.ic-net.or.jp/home/takaken/pz/index.html
|