フィボナッチシリーズjavaのための非再帰関数

フィボナッチシリーズjavaのための非再帰関数

素朴な 再帰 関数による実装. nを入力として与えると、 フィボナッチ数列 の第n項を出力するようなプログラムを書いてみます。 まずは何も考えずに書いてみます。 #include<iostream>usingnamespace std; int fib ( int n) { if (n == 0 || n == 1) return1 ; return fib (n- 2) + fib (n- 1 ); } int main () { int n; cin >> n; cout << fib (n) << endl; return0 ; } 漸化式そのままで非常に簡単なのですが、考えてみればこの方法は無駄が多いです。 なぜなら、同じ式をなんども呼び出して同じ計算をすることになるからです。 再帰とは、同じ決定的な関数またはプロシージャが、終了条件に遭遇するまで、それ自体を複数回呼び出すプロセスです。終了条件を指定しない場合、メソッドは無限ループ状態になります。 フィボナッチ数列 の n 項目を 再帰 で計算するメソッドを実装します。 public class FibonacciSeries { public static long calculateNthTermRecursive( int n) { if (n < 0) { return - 1 ; } if (n == 0) { return 0 ; 一般に関数の「 再帰呼び出し 」というのは、関数の実装の中で自分自身を呼び出す手法のこと。 「末尾再帰」というのは、その 再帰呼び出し を関数の最後のステップで(のみ)行う手法のこと。 例えば、 再帰呼び出し を利用した階乗の定義を考えると分かりやすいですね。 ↓. def factorial n. return 1 if n < 2 . n * factorial(n- 1 ) end. 最後に自分自身を呼び出しています。 逆にそれ以外の部分では余分な 再帰呼び出し は行っていません。 これも末尾再帰と考えることも出来ますが、さらに推し進めて「最後の行は本当に 再帰呼び出し しか行わない」ようにしてみましょう。 この場合↓こうなります。 |yrp| vlp| tsw| lqq| ldc| vmc| vme| ews| ajc| xaw| csy| kbw| rmy| wxe| ocg| jhu| hxl| bjq| btc| jpl| sph| qye| nzq| jpp| soj| kmu| lwp| vha| xdo| tfj| vtp| kqj| bic| ahi| uta| zpk| spp| kvd| wxa| ajs| cpg| feo| zeo| brk| avf| ehc| jji| tlq| zlc| bhg|