両方のアルゴリズムが正しく機能しています。2 つのアルゴリズムはフィボナッチ アルゴリズムであり、ユーザーが指定した n でフィボナッチ数を見つけます。3 つのメソッドがあります。そのうちの 2 つは n でフィボナッチ数を返し、最後のメソッドはすべてのフィボナッチ数を表形式で表示しながら両方のメソッドを実行します。列はコードで ADDITION が実行された回数に対応します。
各アルゴリズムでそれぞれ追加された行を表すグローバル カウンター recAdd と itAdd を宣言しました。これらの値は、テスト ハーネスを実行するたびにリセットされますが、ここでは示しません。
public static long recFib(int n){ //Recursive Fibonacci Algorithm
if( n <= 0){
return 0;
}
if(n == 1){
return 1;
}
else if(n == 2){
return 1;
}
else{
recAdd++; //Counts number of lines added.
return recFib(n-1) + recFib(n-2); //Recurisvely adds fibonnachi numbers. Starts with user's input n. Method is called repeatedly until n is less than 2.
}
}
public static long itFib(int n){ //Iterative Fibonacci Algorithm
long x, y, z;
if(n == 0){
return 0;
}
else{
x = 1;
y = 1;
for(int i = 3; i <=n; i++){
z = x+y; //z is equal to the addition of x and y, which serve as f(n-1) + f(n-2).
x = y; //x is shifted to the next fibonacci number, previously known as y.
y = z; //y is set equal to z, which was the new value created by the old y and the old x.
itAdd++; //counts how many times addition has occured.
}
}
return y;
}
public static void doTheyMatch(int n){
System.out.printf("%s %15s %15s %15s %15s", "i", "Recursive", "recAddCount", "Iterative", "itAddCount\n\n"); //Tab header
for(int i = 0; i <= n; i++){
System.out.printf("%d %12d %12d %12d %12d\n", i, recFib(i), recAdd, itFib(i), itAdd);
}
System.out.printf("%s %15s %15s %15s %15s", "\ni", "Recursive", "recAddCount", "Iterative", "itAddCount\n"); //Repeat for quick referencing
}
出力はこちらです (これらのテキスト ボックスに出力を投稿する際に問題があります =/): http://i.imgur.com/HGlcZSn.png
「doTheyMatch()」メソッド中に加算カウンターが大きくずれているのは、このメソッドを実行するループのためであると確信しています。(メソッドは n 回ループし、ループしている間、反復メソッドと再帰メソッドは独自のメソッド内で反復します)。追加された行数を数える別の方法がわかりません。何かアドバイス?
ありがとう!