-2

嗨,我有一个关于我的代码的快速问题,我需要知道错误在哪里以及为什么它没有正确显示递归和迭代方法(这会返回 stackoverflow 错误)。谢谢

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,因为你没有正确地执行除法。您正在进行整数除法,这会产生错误的结果。这会导致在您的递归算法中无法达到您的基本条件。

要修复它,请使用双打并更改基本条件:

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. 如果您在该函数中输入大于 2 的任何值,您的语句只会检查哪个是问题ifx == 1

于 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 回答