【问题标题】:Reverse an int using recursion使用递归反转 int
【发布时间】:2021-10-05 03:13:49
【问题描述】:

我想反转一个 int 但它不起作用。例如,123 应该返回 321,但打印出来的数字是 356。

public class x {
    public static void main(String[] args) {
        System.out.println(reverse2(123, 0));
    }
    
    static int reverse2(int a, int i) {
        if(a == 0) {
            return 0;
        } else {
            i = i*10 + a%10;
            System.out.println(i); 
            return i += reverse2(a/10, i);
        }
    }
}

【问题讨论】:

  • i = i*10 + a%10; 为什么?
  • 如果您想使用递归创建“打印反向整数”函数,则您的 reverse2 函数中不需要两个 ints。看起来您知道如何使用 % 10 技巧获得最右边的数字,那么为什么所有多余的复杂性?在再次调用递归函数之前,只需执行% 10 获取最右边的数字并执行/ 10 移动数字。
  • 对不起,但我不知道如何只使用一个 int,我使行 i = i*10 + a%10;基于使用 for 循环的教程
  • @dan1st 我根据使用 for 循环的教程制作它

标签: java recursion


【解决方案1】:

您的代码应如下所示:

public class x {
    public static void main(String[] args) {
        System.out.println(reverse2(123, 0));
    }

    static int reverse2(int a, int i) {
        if(a == 0) {
            return i;
        } else {
            i = i*10 + a%10;
            System.out.println(i); 
            return reverse2(a/10, i);
        }
    }
}

当 a 为 0 时,您应该返回 i

在调用reverse2 函数时不应添加i,因为您添加了两次i

【讨论】:

  • 我已经尝试过这种方式,但我只想问为什么我的代码不起作用。它确实打印了 321,然后是 356,差异为 35,并且没有匹配 35 的 i 值
  • 您的代码不起作用,因为当您执行 return i += reverse2(a/10, i); 时,您会在每个呼叫中​​添加 3 + 32 + 321 = 356。一旦您发送该值,您就不需要保留 i 中的值参数值
【解决方案2】:

反向打印整数的递归函数大大复杂化了。一方面,reverse2 没有充分的理由拥有两个整数参数,因为您可以使用单个参数来实现所需的结果。诀窍是使用% 10 操作访问最右边的数字,然后使用/ 10 操作将该数字移出该数字。考虑这些修订:

public class x {
    public static void main(String[] args) {
        System.out.println(reverse2(123));
    }
    
    static String reverse2(int number) {
        if(number == 0) {
            return "";
        } else {
            return number % 10 + reverse2(number / 10);
        }
    }
}

【讨论】:

  • 我要打印整数,方法中使用的打印是只检查i的值
  • @YSJR 很好,我进一步优化了函数以返回包含反转数字的单个字符串。
  • 感谢您的解决方案
  • 请注意,这不是很“优化”,因为它适用于字符串(和字符串连接)而不是数字。
  • @dan1st 就清晰度和简单性而言,与其他解决方案相比,我认为它非常优化。整数转换为字符串,甚至反之亦然,即使对于较大的输入,性能影响也可以忽略不计。此外,由于 OP 想要一个将结果打印为字符串的解决方案,因此函数返回字符串似乎很自然。
【解决方案3】:

你可以这样做。您只需要传递要反转的值。数学计算计算 10 的参数中位数的幂。

public static int reverse(int v) {
    int reversed = 0;
    if (v > 0) {
        int d = (int)Math.pow(10,(int)(Math.log10(v)));
        reversed = reverse(v%d) * 10 + v/d;
    }
    return reversed;
}

当然,如果您可以将第二个参数作为便笺簿传递,则可以这样做。当您拆除原始值时,您会建立返回值。

public static int reverse(int v, int reversed) {
    if (v > 0) {
        return reverse(v / 10, reversed * 10 + v % 10);
    }
    return reversed;
}

【讨论】:

    猜你喜欢
    • 2012-07-06
    • 2020-07-22
    • 2014-04-13
    • 1970-01-01
    • 2018-11-16
    • 2017-07-20
    • 1970-01-01
    相关资源
    最近更新 更多