Fun : itérer sans boucles

En lisant cet article sur les collections en Scala, je me suis posé la question suivante : mais au fait, peut-on itérer sans boucles ? C’est à dire sans utiliser les mots clés mis à disposition par le langage (for, while, do) ?

Vous le saviez déjà, la réponse est oui, en utilisant un concept appris sur les bancs de l’école : la récursion.

Démonstration


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class ForEachWithoutLoopConstruct {

    public static void main(String[] args) {
        List<Integer> list = asList(1, 2, 3);

        foreach(list, new Op<Integer>() {
            public void op(Integer element) {
                System.out.println(element);
            }
        });
    }
   
    public interface Op<T> {
        void op(T element);
    }

    public static <T extends Iterable<U>, U> void foreach(T iterable, Op<U> op) {
        iterateRecursively(iterable.iterator(), op);
    }

    private static <T> void iterateRecursively(Iterator<T> iterator, Op<T> op) {
        if (iterator.hasNext()) {
            op.op(iterator.next());
            iterateRecursively(iterator, op);
        }
    }
}

Pourquoi faire ?

Pour le fun ! C’est toujours bon de se fixer un petit challenge de temps à autre.

La prochaine fois : coder sans les mains.

PS : A ne pas utiliser in real life, les performances d’une boucle native n’ayant rien à voir avec celles d’appels récursifs.

VN:R_U [1.9.22_1171]
Rating: 0 (from 0 votes)
Share

À propos de Pierre-Yves Ricau

Découvrez mon cv dynamique en ligne !
Ce contenu a été publié dans Non classé. Vous pouvez le mettre en favoris avec ce permalien.

7 réponses à Fun : itérer sans boucles

  1. nmaupu@excilys.com dit :

    C’est beaucoup plus fun en haskell (et moins long) :

    pr :: (Show a) => [a] -> IO()
    pr [] = return ()
    pr (x:xs) = do
    print x
    pr xs

    main = do pr [1..5]

    VN:R_U [1.9.22_1171]
    Rating: 0 (from 0 votes)
  2. nmaupu@excilys.com dit :

    Avec l’indentation c’est mieux :

    1
    2
    3
    4
    5
    6
    7
    pr :: (Show a) => [a] -> IO()
    pr [] = return ()
    pr (x:xs) = do
    print x
    pr xs

    main = do pr [1..5]
    VN:R_U [1.9.22_1171]
    Rating: +3 (from 3 votes)
  3. X-S ah ouais quand même… Un ptit commentaire de texte sur ce que fait chaque ligne ? Je suis perdu !

    VN:R_U [1.9.22_1171]
    Rating: 0 (from 0 votes)
  4. nmaupu@excilys.com dit :

    Le code se suffit à lui même :D

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    -- Déclaration d'un fonction qui prend une liste d'éléments quelconque (mais affichable - Show) et qui retourne une monad IO
    pr :: (Show a) => [a] -> IO()
    -- ensuite, dans le cas de la liste vide ([]) on construit une IO monad avec la fonction return
    pr [] = return ()
    -- dans le cas d'une liste on print la valeur (x) et on applique la même fonction sur le reste de la liste (xs)
    pr (x:xs) = do
      print x
      pr xs

    -- [1..5] crée une liste d'entier 1,2,3,4,5
    main = do pr [1..5]
    VN:R_U [1.9.22_1171]
    Rating: +2 (from 2 votes)

Laisser un commentaire