0

现在,在运行我的 Rational 程序时,我在创建一个分子为 2 分母为 0 的新有理数时得到 1,我的老师希望我用 1 而不是 0 替换分母,但我无法得到每当尝试在 reduce 方法中添加 if 用于将分数简化为最简单的形式时,都会出现堆栈溢出错误。我还尝试在包含分子和分母的有理对象所在的构造函数中添加一个 if 语句,但仍然无济于事。当用 0 分子和 2 在分母中创建有理数时,我也有类似的问题。它应该返回 0/1,但返回的是 0。我相信这两个是相关的,有人知道这里发生了什么吗?

 public Rational(int numerator, int denominator) {
    int gcd = reduce(numerator, denominator);
    num = numerator / gcd;
    denom = denominator / gcd;
    if(denom == 0)
    {
     denom = 1;
    }
    
}

private static int reduce(int numerator, int denominator) {
    if(denominator == 0) numerator = 1;
    return reduce(denominator, numerator % denominator);
}
4

1 回答 1

0

我不完全理解这个任务,也不能说出你问题的合理部分,但堆栈溢出错误是由你的函数减少引起的。问题是这个函数没有端点,因为它是递归的,所以函数调用将在堆栈上建立,直到没有更多可用空间,从而导致堆栈溢出。以下更改将修复堆栈溢出错误。

private static int reduce(int numerator, int denominator) {
    if(denominator == 0) { //assuming this is the end point
        numerator = 1;  
        return numerator; //this ends the recursive call
    }
    return reduce(denominator, numerator % denominator);
}

如果您正在寻找一种找到最大公分母的方法,那么对您的函数进行以下更改应该会起作用。

private static int reduce(int numerator, int denominator) {
    if(denominator == 0) { 
        return numerator; 
    }
    return reduce(denominator, numerator % denominator);
}
于 2021-01-04T06:19:57.037 回答