显示从 1 到 100 的数字,不带循环或条件 [闭合]

2022-09-01 07:54:45

有没有办法打印从1到100的数字,而无需使用任何循环或条件,如“if”?我们可以很容易地使用递归,但这又有一个if条件。有没有办法不使用“如果”?也没有重复的打印语句,或包含从 1 到 100 的所有数字的单个 print 语句。

最好使用 Java 解决方案。


答案 1

了解您的图书馆。

public class To100 {
    public static void main(String[] args) {
        String set = new java.util.BitSet() {{ set(1, 100+1); }}.toString();
        System.out.append(set, 1, set.length()-1);
    }
}

(可用于更改分隔符。例如,用于空间分隔。String.replaceAll.replaceAll(", ", " ")

解释:

  • java.util.BitSet是一个方便的小类,表示任意大(非稀疏)的正整数集。(它确实有非常糟糕的部分:不是最终的,不必要的线程安全,不支持良好的构建等。哒哒。
  • Extends允许我只写一次。JDK7“金刚石运算符”应该有助于减少与通用类型的重复,但对于更常见的情况没有帮助。:(BitSetjava.util
  • 双大括号是双大括号习语 - 一个仅包含实例初始化器的匿名内部类。这是一个黑客。它增加了运行时大小,从而增加了启动时间。如果使用 pack200.gz,则分发大小可以忽略不计。我认为现代世界已经为此做好了准备。您的同事可能不是。也许从使用它来测试da开始
  • BitSet.set在集合中设置一点(“设置”这个词的两个完全不同的含义 - 我喜欢它)。这是一个半开放式的范围 - 最高价值独家;底部包含。将 1 添加到顶部以包含 100。
  • BitSet.toString实际上是由 API 文档精确定义的。
  • append随着 J2SE 5.0 中接口的引入而添加。它实质上执行子字符串并打印结果。(一个小秘密:这实际上并不能保证规范来刷新输出,但实现总是会的。PrintStreamAppendable
  • 从 1 开始追加,然后从长度上取下一个,则会从 的字符串表示中剥离大括号。BitSet
  • “了解你的图书馆。”摘自Josh Bloch。参见 Java Puzzlers, puzzle 94。知道库中的内容确实很好。至少知道在哪里看。节省您的时间,节省维护时间,并在第一时间正确。

答案 2

不要在任何理智的情况下这样做!

public class Fail {

    public void thisFails(int x){
        System.out.println(x);
        Integer[] bigArray = new Integer[9450];
        thisFails(x+1);
    }

    public static void main(String[] args) {
        Fail failure = new Fail();
        failure.thisFails(1);
    }
}

当使用1m的堆空间(java -Xmx1m Fail)运行时,它将在第100个递归处耗尽堆。

...

我现在要去洗手。


推荐