-2

こんにちは、私のコードに関して簡単な質問があります。エラーの場所と、再帰的および反復的なメソッドが正しく表示されない理由を知る必要があります (これはスタックオーバーフロー エラーを返します)。ありがとう

import java.util.Scanner;

public class Progression {
    public static int geometricRecursive(int x){
        if(x  == 1)
            return 1;
        else {
            return x * geometricRecursive(x - 1);
        } 
    }

    public static int harmonicRecursive(int x){
        if(x == 1)
            return 1;
        else {
            return x * harmonicRecursive(1/(x - 1));
        }
    }

    public static int geometricIterative(int num){
        int result = 0;
        if(result == 1)
            return result;
        else
            for(int i = 2; i < num; i++){
                result = (i * (i + 1));
            }
        return result;
    }

    public static int harmonicIterative(int num){
        int result = 0;
        if (result == 1)
            return result;
        else
            for (int i = 2; i < num; i ++){
                result = (i * (1/(i+1)));
            }
        return result;
    }

    public static void main(String [] args)
    {
        Scanner keyboard = new Scanner (System.in);
        System.out.println("This program will calculate the geometric and ");
        System.out.println("harmonic progression for the number you enter.");
        System.out.print("Enter an integer that is greater than or equal to 1: ");
        int input = keyboard.nextInt();
        int geomAnswer = geometricRecursive (input);
        double harmAnswer = harmonicRecursive (input);
        System.out.println("Using recursion:");
        System.out.println("The geometric progression of " + input + " is " + geomAnswer);
        System.out.println("The harmonic progression of " + input + " is " + harmAnswer);
        geomAnswer = geometricIterative (input);
        harmAnswer = harmonicIterative (input);
        System.out.println("Using iteration:");
        System.out.println("The geometric progression of " + input + " is " + geomAnswer);
        System.out.println("The harmonic progression of " + input + " is " + harmAnswer);
    }
}
4

3 に答える 3

3

分割を正しく実行していないため、StackOverflow が発生します。整数除算を行っているため、間違った結果が得られます。これにより、再帰アルゴリズムで基本条件に到達できなくなります。

これを修正するには、double を使用して基本条件を変更します。

public static double harmonicRecursive(double x)
{
   if(x <= 1.0)
   {
       return 1.0;
   }
   else
   {
       return x * harmonicRecursive(1.0 / (x - 1.0));
   }
}
于 2013-03-21T18:10:44.467 に答える
2

問題のある行はreturn x * harmonicRecursive(1/(x - 1));メソッドにありharmonicRecursive(int x)ます。コードの1/(x - 1)一部は、すべてに対して返さ0れますx > 2。あなたのifステートメントx == 1は、その関数に2より大きいものを入力した場合にのみ、どれが問題であるかをチェックします。

于 2013-03-21T18:14:34.853 に答える
1

この方法を次のように変更します。

public static int harmonicRecursive(int x){

   if(x <= 1) //Here

       return 1;

   else {

      return x * harmonicRecursive(1/(x - 1));

   }
}
于 2013-03-21T18:10:39.933 に答える