-2

我有一个 comp sci 问题,需要以下内容:

编写一个接受十进制数x和整数的方法n。四舍五入xn小数位(例如,0表示四舍五入到最接近的整数、1表示四舍五入到最接近的十分之一等)。

我看不出这个问题是如何使用递归来解决的,这似乎太直接了。

4

3 回答 3

3

似乎在这里使用递归只会适得其反。

nullptr建议的递归方法:

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;
}
于 2013-05-09T01:16:02.490 回答
2

这个怎么样?

double round(double x, int n)
{
    if (n <= 0)
        return Math.round(x);

    return round(x * 10, n - 1) / 10;
}

如果您不能使用Math.round().

于 2013-05-09T01:06:29.157 回答
0

我使用了递归和解析,但是我认为存在一些逻辑漏洞。

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);
    }





}
于 2015-12-17T00:38:42.567 回答