Я посмотрел на этот вызов, когда увидел головоломку в стиле кроссворда, где у каждого квадрата есть номер, и вам нужно найти, какая буква соответствует какому числу, чтобы слова были правильными.Зная, что я касаюсь уже даных ответов, я постараюсь обобщить проблему и покажу, как ее можно рекурсивно решить.
В случае слова x меньший массив A представляет собой последовательность чисел,и большой массив B содержит буквы алфавита.Задача состоит в том, чтобы присвоить каждому номеру букву и найти все возможные комбинации.Обычно мы имеем:
A={1,2,...m} and B={1,2,....n} n>=m
Каждый возможный результат может быть записан в виде массива C с m элементами, где элемент i содержит значение j для пары A (i) B (j).Общее количество перестановок, то есть C-массивов, равно n (n-1) ..... (n-m + 1) или более аккуратно: n! / (M + 1)!
Это число следует из мысли, что когда первый элемент A связан с любым из элементов в B, второй элемент A может быть связан с любым элементом , за исключением , который был взят первым,и т. д. и т.1018 * Этот код не будет работать для произвольной длины A, и было бы неудобно писать для больших m, поэтому лучше сделать это рекурсивным с помощью процедуры AllPairs, которая может вызывать себя:
AllPairs (A,B,C)
if Size(A)>1 ' check no of elements in A
for i=1 to Size(B)
C(Size(C)-Size(A)+1)= B(i)
A'=Remove element 1 from A
B'=Remove element i from B
Call AllPairs(A',B',C) 'recursive call
Next i
else ' only one element in A
for j=1 to Size(B)
C(Size(C)) = B(i) 'looping last element in C through all unused in B
Collect.ADD(C) 'collect C-arrays here for later use
Next j
End AllPairs
Обратите внимание, чтоC изначально представляет собой пустой массив с таким же размером, что и A (может также быть копией A).C остается того же размера, в то время как A и B последовательно уменьшаются, пока A не содержит только один элемент, и рекурсивный вызов заканчивается.Это сделало бы это.Возможно (со всем уважением) это похоже на ответ кода Джинги Чжэна - (я не могу сказать).Мое намерение здесь состоит в том, чтобы попытаться дать легкую интуитивную версию псевдокода.Это решение может быть найдено в VB здесь.