Utwórz stałą powtarzającą się permutację większego zestawu

Wiem, że ten temat jest dużo dyskutowany, ale nie mogę znaleźć żadnej implementacji, która pasowałaby do moich potrzeb.

Mam następujący zestaw znaków:

a b c d e f g h

Chcę uzyskać wszystkie możliwe permutacje lub kombinacje (nie powtarzające się),ale na ograniczonym (zmiennym) zestawie znaków, co oznacza, gdy wprowadzę znaki i liczbę2, wyniki powinny wyglądać

ab ba ac ca ad da ae ea af fa ag ga ah ha
bc cb bd db be eb bf fb bg gb bh hb
cd dc ce ec cf fc cg gc ch hc
de ed df fd dg gd dh hd
ef fe eg ge eh he
fg gf fh hf
gh hg

Mam nadzieję, że rozumiesz, dokąd z tym zmierzam. Obecnie mam implementację, która daje mi permutacjewszystko postacie, ale nie mogę oprzeć głowy, jak zaimplementowaćlimitowana przestrzeń dla tych permutacji:

public function getPermutations($letters) {
    if (strlen($letters) < 2) {
        return array($letters);
    }

    $permutations = array();
    $tail = substr($letters, 1);

    foreach ($this->getPermutations($tail) as $permutation) {
        $length = strlen($permutation);

        for ($i = 0; $i <= $length; $i++) {
            $permutations[] = substr($permutation, 0, $i) . $letters[0] . substr($permutation, $i);
        }
    }

    return $permutations;
}

questionAnswers(2)

yourAnswerToTheQuestion