You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SICP平方根算法Java改写遇6处编译错误,求修正提示

从SICP平方根Python实现转Java时的编译错误修正提示

先看你给出的SICP中求平方根的Python实现:

def sqrt(x): return sqrt_iter(1, x)
def sqrt_iter(guess, x):
    if x < 0: raise ValueError("n must not be negative.")
    while True:
        if good_enough_p(guess, x): return guess
        else: guess = improve(guess, x)
def improve(guess, x): return average(guess, x/guess)
def good_enough_p(guess, x): return abs(guess**2 - x) < 0.00001
def average(x, y): return (x + y) / 2

你尝试转写成的Java代码出现了6个编译错误,不用啃完《Core Java Volume》就能搞定,我们一个个拆解问题:

你的错误Java代码

public class Newton {
    public static double sqrt(double x) { return sqrtIter(1, x); }
    public double sqrtIter(double guess, double x) {
        if (x < 0) { throw new IllegalArgumentException("x must not be negative."); }
        while (true) {
            if (goodEnough(double guess, double x)) { return guess; }
            else { guess = improve(guess, x); }
        }
        public double improve(double guess, double x) { return average(guess, x/guess); }
        public double average(double x, double y) { return (x + y) / 2; }
        public boolean goodEnough(double guess, double x) { return Math.abs(guess*guess -x) < 0.0001; }
    }
}

编译错误的问题点及修正提示

  • 错误1-3:调用goodEnough时的语法错误
    调用方法时不需要再次声明参数类型,直接传变量名即可。把goodEnough(double guess, double x)改成goodEnough(guess, x)就能解决前三个错误。
  • 错误4:else without if
    这个是代码结构混乱导致的——你把后续方法定义塞进了sqrtIter方法内部,编译器误以为while代码块提前结束,因此报错。解决了方法嵌套问题后,这个错误会自动消失。
  • 错误5-6:方法嵌套定义
    Java不允许在一个方法内部定义另一个方法!你需要把improve、average、goodEnough这三个方法移到sqrtIter方法外面,和sqrt、sqrtIter同级。
  • 额外小问题:静态方法调用非静态方法
    入口方法sqrt是静态方法,但sqrtIter不是,直接调用会报错。给sqrtIter和其他工具方法都加上static关键字,保证静态方法可以直接调用它们。
  • 参数检查位置优化
    你现在把x < 0的检查放在sqrtIter里,但每次迭代都会重复执行这个检查,把它移到入口方法sqrt里会更合理。

修正后的Java代码示例

public class Newton {
    public static double sqrt(double x) {
        if (x < 0) { 
            throw new IllegalArgumentException("x must not be negative."); 
        }
        return sqrtIter(1, x); 
    }

    private static double sqrtIter(double guess, double x) {
        while (true) {
            if (goodEnough(guess, x)) { 
                return guess; 
            } else { 
                guess = improve(guess, x); 
            }
        }
    }

    private static double improve(double guess, double x) {
        return average(guess, x / guess);
    }

    private static double average(double x, double y) {
        return (x + y) / 2;
    }

    private static boolean goodEnough(double guess, double x) {
        return Math.abs(guess * guess - x) < 0.0001;
    }
}

这样修改后就能正常编译运行了,核心就是记住Java的方法不能嵌套、调用方法时不用写参数类型、静态方法只能直接调用静态方法这些基础语法点~

内容的提问来源于stack exchange,提问作者Wizard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 08:32:57