private static int reverse(int n, int r) {
if (n == 0) return r;
return reverse(n/10, 10*r+n%10);
}
public static int reverse(int n) {
return reverse(n, 0);
}
Run Code Online (Sandbox Code Playgroud)
我已经测试了这个并且它有效,我只是无法弄清楚如何.我知道这个数字被除以10然后再次进入循环,但似乎直到n变为小数<1,r根本就没有被使用.救命 ?
r从0开始,每次递归调用时,新值r都设置为10*r+n%10.在一个循环中,等价物将是r = 10*r+n%10.
当n为0时,返回最终值r(将保存最终结果).
以下是将代码转换为循环的方法:
if (n == 0) return r;
Run Code Online (Sandbox Code Playgroud)
如果n为0,则不再进行进一步的递归.由于函数是尾递归的(即简单地返回每个递归结果的结果),这意味着循环在此结束.所以我们的循环看起来像这样:
while(n != 0) {
}
Run Code Online (Sandbox Code Playgroud)
那么如果n不是0 会发生什么:
return reverse(n/10, 10*r+n%10);
Run Code Online (Sandbox Code Playgroud)
好的,所以循环继续,n/10作为新值n和10*r+n%10新值r.所以这是我们得到的循环:
while(n != 0) {
n = n / 10;
r = 10*r+n%10;
}
Run Code Online (Sandbox Code Playgroud)