再帰関数と非再帰関数を比較して、クラスプロジェクトでどちらが速いかを確認することになっています。教授はまた、イテレータが10,100,1000などに等しい場合、ミリ秒単位で反復の時間を計測することを望んでいます。すべてが機能するようになりましたが、C ++でタイマーを取得するのに多くの問題があったため、Javaに切り替えました。ミリ秒の出力を取得する方が簡単です。
しかし、8,000を超える数値を使用しようとすると、再帰アルゴリズムから大きなファットスタックオーバーフローエラーが発生します。誰かが私に洞察を与えることができますか?ボーナス:Non-Recursiveで行ったように、Recursive関数でタイマーを実行する方法もわかりません。これにどのようにアプローチしますか?
public class comparingTimes {
public static void main(String[] args) {
double num = 10000;
double result;
nonRec(num);
result = rec(num);
System.out.printf("Rec %.0f",(result));
}
public static void nonRec(double num)
{
double resultNum = 1;
double total = 0;
long startTime = System.currentTimeMillis();
long endTime;
for (double i = 1; i < num; i++)
{
total += i * (i+1);
if (i == resultNum)
{
endTime = System.currentTimeMillis();
System.out.printf("Total execution time: %f seconds - num = %.0f%n", (endTime - startTime)/1000.0, i);
resultNum *= 10;
}
}
System.out.printf("NonRec: %.0f%n", total);
}
public static double rec(double num)
{
if (num == 0)
return 0;
else
return num * (num-1) + rec(num-1);
}
}