我目前只能停留在我不太了解的一行代码上。 因此,我正在阅读本书中的示例代码,“程序”之一使用递归来确定整数n中的位数。我被困住并且不完全理解的一行代码是:
if (number >= 10) {
return numberOfDigits(number / 10) + 1;
例如,这使数字42返回2。但是该函数究竟如何返回2? 42除以10等于4,2或4。加1为5,那么它如何返回2?
答案 0 :(得分:2)
递归是一种方法,它使方法的一个调用执行某些工作,同时将其余工作推迟到进行另一个递归调用。在这里,“数字位数”递归方法表示数字中的位数等于最后一位的1
加上最后一位删除后剩余的位数。
在return
语句中,+ 1
计算数字中的最后一位,而number / 10
执行截断整数除法以删除最后一位。递归调用对数字中的数字进行计数,最后一位被删除。
当数字为一位数字(不大于或等于10
)时,未显示的是递归的基本情况。这只是1
位数字。值4
未计入计算中。该方法有效地对数字进行一次计数,直到没有剩余的数字为止。每位数有一个递归方法调用。
答案 1 :(得分:0)
完整方法可能看起来像这样:
public int numberOfDigits(int number) {
if (number >= 10) {
return numberOfDigits(number / 10) + 1;
}
// base case: only one digit
return 1;
}
通过检查,如果我们传递两位数字,则if
语句将被命中,它将返回输入/ 10的递归调用加1。假设输入为42
。在这种情况下,它将返回numberOfDigits(42 / 10) + 1
。我们知道numberOfDigits(4)
返回1,因此总共返回2,这是正确的。
使用归纳推理,我们可以增强自己的能力,以说服任意数量的任意长度。
旁注:在旅行中,我经常看到基本案例首先使用if
语句处理,而归纳案例默认发生。因此,我本来希望看到以下代码:
public int numberOfDigits(int number) {
if (number < 10) return 1;
return numberOfDigits(number / 10) + 1;
}