java 对于3位或更多位的数字,使用递归对数字进行求逆会产生错误的结果

fcg9iug3  于 2022-12-21  发布在  Java
关注(0)|答案(5)|浏览(137)

下面给出的代码适用于两位数的数字,也就是说,高达99,但我不知道为什么它打破后。例如。它给51作为输出的数字123,但它应该是321。有人能帮助我吗?

public class Main
{
    static int reverse(int n){
        if(n<10)
            return n;
        else
            return ((n%10)*10)+(reverse(n/=10));
    }
    public static void main(String[] args) {
        System.out.println(reverse(123));
    }
}
r6l8ljro

r6l8ljro1#

对于n = 123:n % 10 * 10得到30。接下来,将n除以10,得到12,并将其传递到递归调用中。由于您的方法对两位数正确工作,因此得到21。30 + 21等于51。
一个只使用数学的递归方法(相对于字符串操作)并不简单,我想我会求助于迭代的解决方案,如果你想用这个问题来训练递归,你可能应该看看azro已经建议的字符串操作。
为了说明结合数学和递归所面临的挑战,请考虑如何反转102。预期为201。有两种方法:
1.你可以将10传递给递归调用,并将结果附加到2。10的逆是01,你将得到1,所以简单的解决方案将给予你21,而不是201。可能有一种方法可以知道递归调用的中间结果应该被理解为两位数,你需要创造性。
1.或者你把02传递给一个递归调用,并把1附加到结果上。同样,这种简单的方法会产生21,而不是201。

zzzyeukh

zzzyeukh2#

你在做数学加法,使用字符串连接会更容易

static String reverse(int n) {
    if (n < 10)
        return "" + n;
    else
        return "" + n % 10 + reverse(n / 10);
}
pprl5pva

pprl5pva3#

你只能反向清零最后一位数字。这只适用于小于100的数字(用一个递归调用)。

8aqjt8rx

8aqjt8rx4#

问题出在((n%10)*10)+上。这部分应该把最后一位数和反数连接起来,但它只是把数字乘以10并求和。对于两位数,它是有效的,因为乘以10实际上是把第二位的数字放在第一位。但它对大于10的数字不起作用。
您应该改为连接字符串。

uajslkp6

uajslkp65#

如果你想要一个纯粹的数学基础上的解决方案,你可以这样做。

  • div是10的当前位数的幂。
  • 然后你反向建立数字。2要了解这是如何工作的,在递归调用之前和之后放一些print语句。
public static int reverse(int n) {
      int rev = 0;
      if (n > 0) {
           int div = (int)Math.pow(10,(int)(Math.log10(n)));
           rev = 10 * reverse(n%div) + n/div;
      }
      return rev;
}

相关问题