【发布时间】:2016-04-17 22:22:56
【问题描述】:
我正在处理的问题是:
以下方法是古希腊人已知的计算方法 平方根。给定一个值 x > 0 和平方根的猜测 g,a 更好的猜测是 (g + x/g) / 2. 编写一个递归辅助方法 public 静态 squareRootGuess(双 x,双 g)。如果 g^2 大约是 等于 x,返回 g,否则,返回 squareRootGuess 更好的猜测。然后写一个方法 public static squareRoot(double x) 使用辅助方法。
我不确定我应该在这里做什么。我不相信我的基本情况对于这个功能是正确的。我不太清楚问题到底在问什么。
public class rootchecker {
public static void main(String[] args)
{
System.out.println(squareRoot(125));
System.out.println(squareRoot(4));
}
// helper
public static double squareRoot(double x)
{
return squareRootGuess(x, x-1);
}
// recursive
public static double squareRootGuess(double x, double g)
{
if (x == 1)
{
return 1;
}
else
{
double ans = (g + (x/g) / 2);
return squareRootGuess(x-1, ans);
}
}
}
更新:
我已经修复了我的基本情况。我的代码现在如下:
public class rootchecker {
public static void main(String[] args)
{
System.out.println(squareRoot(125));
System.out.println(squareRoot(4));
}
// helper
public static double squareRoot(double x)
{
return squareRootGuess(x, x-1);
}
// recursive
public static double squareRootGuess(double x, double g)
{
if (Math.abs(Math.sqrt(x) - g) < 0.001)
{
return g;
}
else
{
double ans = (g + (x/g) / 2);
return squareRootGuess(x, ans);
}
}
}
继续解决问题,我的逻辑对于 else 语句是否正确?考虑到我收到堆栈溢出错误,我不相信它。
【问题讨论】:
-
它在你写的文本中说你应该什么时候返回 g
If g^2 is approximately equal to x, return g -
所以它只是
if (x == Math.sqrt(2.0));? -
他们说大约相等,所以我会这样做
if (Math.abs(Math.sqrt(x) - g) < 0.001) -
那么你需要一个大约的定义。你能在 0.000000001 之内 0.5 之内的 1 个整数之内 近似值是多少?
-
你把右括号放错了地方。它可以是
(g + x / g) / 2。由于运算顺序,x / g周围不需要括号。