Toutes les combinaisons d’un array

Le problème : calculer toutes les combinaisons d’un array à 1 dimension avec N éléments.

Donc si on avait un array à 2 éléments, et que toutes nos array avaient toujours 2 éléments (ou 3, peu importe).

On pourrait imaginer une solution en dur tel que:

Bien que le résultat soit correct, ce n’est pas terrible, car au-delà du 2ème élément ça ne marcherait plus. Voici le résultat:

 

Le meilleur moyen de régler ce problème c’est à travers les fonctions récursives. Une fonction récursive est une fonction qui s’appelle elle-même tant que des conditions sont remplies.
Par exemple nous allons écrire une fonction qui va vérifier s’il y a encore des éléments à traiter dans l’array et si c’est le cas elle s’appelle pour traiter le niveau supplémentaire.

Le résultat:

first
first first
first first first
first first first first
first first first second
first first first third
first first first fourth
first first second
first first second first
first first second second
first first second third
first first second fourth
first first third
first first third first
first first third second
first first third third
first first third fourth
first first fourth
first first fourth first
first first fourth second
first first fourth third
first first fourth fourth

etc.

 

  • Non

    Une amélioration (3 à 4 fois plus rapide)

    function Get-Permutations
    {
    param ($array, $cur, $depth, [System.Collections.Arraylist]$list)
    $depth ++
    $count=$array.Count #!!
    for ($i = 0; $i -lt $count; $i++)
    {
    $s= »$cur $($array[$i]) » #!!
    [void]$list.Add($S)

    if ($depth -lt $Count)
    {
    $list = Get-Permutations $array $S $depth $list
    }
    }

    $list
    }

    $array = @(« first », »second », »third », »fourth », »Five », »six »)
    $list = New-Object System.Collections.Arraylist #!!
    $begin=get-date
    $list = Get-Permutations $array «  » 0 $list
    $end=get-date
    $end-$begin
    $list

  • Super, merci