为什么我的递归不起作用?

时间:2016-02-10 14:17:42

标签: java

为什么我的代码不起作用?我正在尝试实现一个递归方法,它将返回整数所具有的位数。这是我的代码:

public int numOfDigits(int num) {
    if (num < 10)
        return 1;
    return numOfDigits(num / 10);
}

3 个答案:

答案 0 :(得分:8)

num除以10时,您将摆脱一位数(最后一位),但您忘记将其添加到结果中。

您需要的代码应该更像:

public int numOfDigits(int num) {
    if (num < 10)
        return 1;
    return 1 + numOfDigits(num / 10);
}

......可以使用三元运算符将其简化为一个班轮:

public int numOfDigits(int num) {
    return (num < 10) ? 1 : 1 + numOfDigits(num / 10);
}

答案 1 :(得分:4)

阻止递归的numOfDigits的最后一次调用返回1.这个值只是冒泡到初始调用者。

修复是写return 1 + numOfDigits(num / 10/*integral division removes a digit*/);

假设你没有通过递归获得乐趣,一旦你有算法工作,用一个简单的循环替换它:在这里使用递归在堆栈帧创建方面是浪费的。

至于替代方案,请注意以10为底的对数可能会导致精度问题。我知道的最快的方式是

final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,
                                  99999999, 999999999, Integer.MAX_VALUE };

// Requires positive x
static int digits(int x) {
    for (int i=0; ; i++)
        if (x <= sizeTable[i])
            return i+1;
}

从Java 6库中窃取代码。

答案 2 :(得分:0)

public int numOfDigits(int num) {
    if (num < 10)
        return 1;
    return numOfDigits(num / 10);
}

这很好,只是你不理解它。例如,你称之为

numOfDigits(1000)

原始num = 1000 当你到达

return numOfDigits(num / 10);

实际上你在呼叫return numOfDigits(100); 这将再次运行此方法,但这次num = 100

所以当你到达return numOfDigits(num / 10);

实际上你在呼叫return numOfDigits(10); 这将再次运行此方法,但这一次num = 10 10不小于10,所以你将再次到return numOfDigits(num / 10);,这次你打电话给return numOfDigits(1);

num = 1 第一次if statement将是true

if (num < 10)
        return 1;

这意味着无论什么总是return 1

唯一的区别是需要多少循环才能完成。