Java无限方法运行

标签 java

我创建了一个类来对有理数进行算术运算,问题是当我运行程序时,它一直在运行,并且在多次尝试后从未停止或显示结果,我发现问题出在 reduce 方法上它只是卡住了并且从未完成。有任何想法吗 ?

private void normalize() {
    if ( (this.num > 0 && this.den < 0) || (this.num < 0 && this.den < 0)){
        this.num = -this.num;
        this.den = -this.den;
    }
}

private void reduce(int n , int d) {
    int  r , L = 0; 
    while ( (n!=0) && (d!=0) ) {
        if (this.den > this.num)    
            r = den % num ; 
        else 
            r = num % den ;
        while (r != 0 ){
            for ( int i= r ; i>0 ; i-- ){
                if (den % i == 0 && num % i == 0 )
                    L = i ; 
            }
            num = num / L ; 
            den = den / L ; 
        }
    }
}

public Rational (int num , int den) {
        this.num = num ; 
        this.den = den ;
        normalize();
        reduce (this.num , this.den) ; 
}

最佳答案

我想我明白了你困惑的根源。您将 num 和 den 传递给 reduce(int n, int d),但 n 和 d 被分配与 num 和 den 相同的,而不是相同的引用。因此,即使 num 和 den 的值在 while 循环中发生变化,这些变化也不会反射(reflect)在 n 和 d 的值中。

另请注意,您正在对整数进行除法并将结果分配给整数,这在数学上可能是不可取的。

另一件事:即使在解决了 n 和 d 的问题之后,您仍然有一个永远不会退出的内部 while 循环,因为 r 的值永远不会改变。您需要在循环中更新r的值,使其最终变为0。

关于Java无限方法运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46919574/

相关文章:

java - JsonIdentityInfo 用于 hibernate 映射

java - 测试 AbstractProcessor(Java 在编译时的注解处理)

java - 操作系统版本、API 级别和 Java 版本之间的关系

java - Log4j RollingFileAppender 在 Linux 上滚动,但在 Windows 上不滚动

java - 返回值 android 中 Intent 的最佳实践

java - 使用Ant写入属性文件以在JAVA中使用

java - 如何避免gson tojson递归

java - CXF - 如何使用 CXF 3.2.6 正确配置 Spnego

java - 在 java 中使用 volatile 变量

java - GWT DataGrid 未显示