我有一个 comp sci 问题,需要以下内容:
编写一个接受十进制数x
和整数的方法n
。四舍五入x
到n
小数位(例如,0
表示四舍五入到最接近的整数、1
表示四舍五入到最接近的十分之一等)。
我看不出这个问题是如何使用递归来解决的,这似乎太直接了。
似乎在这里使用递归只会适得其反。
double round(double x, int n) {
if (n <= 0)
return Math.round(x);
return round(x * 10, n - 1) / 10;
}
是有效的,但没有必要。本质上,该方法与以下方法相同:
double round(double x, int n) {
double factor = Math.pow(10, n);
return Math.round(x * factor) / factor;
}
这种方法可能会执行得更快,并且不会冒险StackOverflowError
(尽管这不太可能,只有在 的值很大时n
)。
对于具有明确基本案例和简化案例的案例,您应该使用递归,例如:
n <= 1
factorial(n-1)
四舍五入到n位小数并不适合递归。
奖励:四舍五入到任何基数中最接近的第n小数部分:
double round(double x, int n, int radix) {
double factor = Math.pow(radix, n);
return Math.round(x * factor) / factor;
}
这个怎么样?
double round(double x, int n)
{
if (n <= 0)
return Math.round(x);
return round(x * 10, n - 1) / 10;
}
如果您不能使用Math.round()
.
我使用了递归和解析,但是我认为存在一些逻辑漏洞。
public static double problem3(double x, int y)
{
// Trying to take the double, turn it into a string, manipulate past the decimal
// probably not the most efficient method..
String P = Double.toString(x).substring(0, Double.toString(x).length()-1);
String k =P.substring(P.indexOf('.')+ 1,P.length());
if (k.length()==y)
{
if (P.charAt(P.length()-1)<5)
{
return Double.parseDouble(P);
}
else
{double o7 = Double.parseDouble(P)*Math.pow(10, k.length());
o7++;
o7=o7/Math.pow(10, k.length());
return o7;
}
}
else
{
return problem3(Double.parseDouble(P),y);
}
}