33 votes

Afficher des nombres de 1 à 100 sans boucles ni conditions

Existe-t-il un moyen d'imprimer des nombres de 1 à 100 sans utiliser de boucles ou de conditions du type "if" ? On peut facilement le faire en utilisant la récursion, mais là encore, il y a une condition "if". Existe-t-il un moyen de le faire sans utiliser de "if" également ? Il ne faut pas non plus utiliser d'instructions d'impression répétitives, ni une seule instruction d'impression contenant tous les chiffres de 1 à 100.

Une solution en Java est préférable.

177voto

Connaissez vos bibliothèques.

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);
    }
}

(Vous pouvez utiliser String.replaceAll pour changer le séparateur. Par exemple, .replaceAll(", ", " ") pour la séparation des espaces).

Explication :

  • java.util.BitSet est une petite classe pratique qui représente un ensemble arbitrairement grand (non épars) d'entiers positifs. (Elle a quelques mauvais côtés : non finale, inutilement thread-safe, ne supporte pas bien la construction, etc )ta.
  • Prolonge BitSet me permet d'écrire java.util une seule fois. L'"opérateur diamant" du JDK7 devrait aider à réduire les doublons avec les types génériques, mais n'est d'aucune aide pour la situation la plus courante :(
  • Les doubles accolades sont les L'idiome "Double Brace - une classe interne anonyme contenant uniquement un initialisateur d'instance. C'est un hack. Il augmente la taille d'exécution, et donc le temps de démarrage. La taille de la distribution est négligeable si vous utilisez pack200.gz. Je pense que le monde moderne est prêt pour cela. Vos collègues ne le sont peut-être pas. Commencez peut-être par l'utiliser pour des tests.
  • BitSet.set se place un peu dans l'ensemble (deux sens complètement différents du mot "ensemble" là - j'aime ça). C'est un intervalle semi-ouvert - la valeur supérieure est exclusive, la valeur inférieure est inclusive. Ajoutez 1 à la valeur supérieure pour inclure 100.
  • BitSet.toString est en fait précisément définie par les documents de l'API.
  • append a été ajouté à PrintStream avec l'introduction de la Appendable dans J2SE 5.0. Elle effectue essentiellement une sous-chaîne et imprime le résultat. (Un petit secret : la spécification ne garantit pas vraiment que la sortie sera vidée, mais les implémentations le feront toujours).
  • En commençant l'append à 1, et en enlevant un de la longueur, on retire les accolades de la représentation de la chaîne de caractères de BitSet .
  • "Connaissez vos bibliothèques." Tiré de Josh Bloch. Voir les énigmes de Java, énigme 94. C'est vraiment bien de savoir ce qu'il y a dans les bibliothèques. Ou du moins de savoir où chercher. Économisez votre temps, économisez le temps de la maintenance et faites-le bien du premier coup.

119voto

z - Points 5610

NE FAITES PAS CELA, QUELLES QUE SOIENT LES CIRCONSTANCES !

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);
    }
}

Lorsqu'il est exécuté en utilisant 1m d'espace de tas (java -Xmx1m Fail), il sera à court de tas à la 100ème récursion.

...

Je vais maintenant aller me laver les mains.

70voto

nikie Points 7479

Existe-t-il un moyen d'imprimer des nombres de 1 à 100 sans utiliser de boucles ou de conditions comme "if" ?

Je n'arrive pas à croire que personne n'ait encore suggéré ça :

System.out.println("numbers from 1 to 100 without using any loops or conditions like \"if\"?");

64voto

Adam Pope Points 2454

Consultez la réponse de Diviser + Conquérir dans le fil de discussion C#. C'est diabolique, mais brillant :

Comment imprimer de 1 à 100 sans aucune boucle en utilisant C#.

Voici la version Java :

public class Application {

    public static void main(String[] args) {
        Print64Numbers();
        Print32Numbers();
        Print4Numbers();
    }

    private static int currentNumber = 0;

    private static void Print1Number() { System.out.println(++currentNumber); }
    private static void Print2Numbers() { Print1Number(); Print1Number(); }
    private static void Print4Numbers() { Print2Numbers(); Print2Numbers(); }
    private static void Print8Numbers() { Print4Numbers(); Print4Numbers(); }
    private static void Print16Numbers() { Print8Numbers(); Print8Numbers(); }
    private static void Print32Numbers() { Print16Numbers(); Print16Numbers(); }
    private static void Print64Numbers() { Print32Numbers(); Print32Numbers(); }
}

48voto

Yacoby Points 29771

Pseudo code. Utilise un tableau pour forcer une exception après 100 éléments qui est attrapée et ne fait rien.

function r(array a, int index){
    a[index] = a[index-1]+1
    print a[index]
    r(a, index+1)
}

try{
    array a;
    a.resize(101)
    r(a, 1)
}catch(OutOfBoundsException){
}

EDIT
Code Java :

public void printTo100(){
    int[] array = new int[101];
    try{
        printToArrayLimit(array, 1);
    }catch(ArrayIndexOutOfBoundsException e){
    }
}
public void printToArrayLimit(int[] array, int index){
    array[index] = array[index-1]+1;
    System.out.println(array[index]);
    printToArrayLimit(array, index+1);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X