为什么我的代码不起作用?我正在尝试实现一个递归方法,它将返回整数所具有的位数。这是我的代码:
public int numOfDigits(int num) {
if (num < 10)
return 1;
return numOfDigits(num / 10);
}
答案 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
当你到达 p>
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
。
唯一的区别是需要多少循环才能完成。