r根本不用
10*r+n%10
实际上,这是一件很棘手的事情,而且很酷。
这是一个很好的例子,说明变量命名不当会使代码难以理解。我们有3行代码可以实际执行某些操作,但它的工作原理并不明显。
private static int NOTHING_REVERSED_SO_FAR = 0;
private static int reverse(int numberToBeReversed, int reversalSoFar) {
if (numberToBeReversed == 0) return reversalSoFar;
return reverse(numberToBeReversed/10, 10*reversalSoFar + numberToBeReversed%10);
}
public static int reverse(int numberToBeReversed) {
return reverse(numberToBeReversed, NOTHING_REVERSED_SO_FAR);
}
所以我们首先调用public方法。假设我们通过123作为数字的倒数。这将调用未经更改传递123的私有版本,并将reversalSoFar初始化为0。
所以马上,你就可以看到,如果numberToberVersed是0,我们就返回到目前为止计算出的值。我建议您编写一个junit测试来挑战他的断言。
所以当我们递归的时候,我们到底在做什么?首先,我们并不是真的把数字除以10。我们在做分区,通过
递归地。未更改反向的数字。
分割结果为123->123/10->12。(由于是int数据类型,分数丢失了。)好的,我们将传递一个12作为第一个参数。第二个论点呢。我们知道我们通过了0的逆转。所以我们有10*(0)+(123)%10。123在这里是正确的,因为我们没有改变数字。结果是3。所以我们将再次递归,通过12和3。
现在,进行下一次迭代。
0. 123 0
1. 12 3
2. ?? ?