难以理解的程序

4

我有一个程序,但我不理解它的结果。它给了我 110,但我不知道怎么可能。我只调用了一次。对我来说,应该是3?谢谢。

public class Test {
    public static String operator (int n) {
        return((n == 0) ? "" : operator(n / 2) + (n % 2));
    }

    public static void main(String[] args) {
        System.out.println(operator(6));
    }
}

2
我认为问题不在于递归,而是字符串连接与算术混淆了。 - Paul
为此,您需要一个调试器。将程序放入调试器中,并逐步进行。我建议您将复合语句中的所有语句分开,以便您可以查看每个语句的结果;创建临时变量来保存对operator()的每次调用的结果等。我的猜测是,您最初的问题在于您没有意识到它是递归的 - operator()方法会调用自身。 - arcy
我在程序中没有看到任何字符串连接... - arcy
更仔细地看:operator(n/2)+(n%2)operator() 返回什么? - Paul
这是十进制数6的二进制值。 - MaxZoom
3个回答

6
这个函数中的递归导致每次迭代都会将原始参数的模数附加到中间值上进行重复评估。因此,按照以下方式展开operator(6):
  1. operator(6) => operator(6/2)+(6%2) = operator(3) + "0"
  2. operator(3) => operator(3/2)+(3%2) = operator(1) + "1"
  3. operator(1) => operator(1/2) + (1%2) = operator(0) + "1"
  4. operator(0) => ""
递归在第4次迭代时结束,展开结果为"110"。

3

这是一个简单的递归方法,可以通过以下方式表达以使其更易读:

operator(0) = ""
operator(n) = operator(n / 2) + (n % 2)

遵循这些规则,operator(6) = "110" 如下:

operator(6) = operator(6 / 2) + (6 % 2)
            = operator(3) + 0
            = operator(3 / 2) + (3 % 2) + 0
            = operator(1) + 1 + 0
            = operator(1 / 2) + (1 % 2) + 1 + 0
            = operator(0) + 1 + 1 + 0
            = "" + 1 + 1 + 0
            = "110"

0

operator 返回一个字符串。因此,operator(n/2)+(n%2) 的结果是将来自 operator(n/2) 的字符串与值为 (n%2) 的字符串连接(拼接),后者会自动转换为字符串以便进行连接。

尝试更改 operator 以返回 int 并更改该行以读取:

return((n == 0) ? 0 : operator(n/2)+(n%2));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接