Это популярная таблица соответствия:
d = { '2': "ABC",
'3': "DEF",
'4': "GHI",
'5': "JKL",
'6': "MNO",
'7': "PQRS",
'8': "TUV",
'9': "WXYZ",
}
Учитывая этот или любой другой d
(исполняемый) псевдокод для преобразования строки цифр во все возможные строки букв:
def digstolets(digs):
if len(digs) == 0:
yield ''
return
first, rest = digs[0], digs[1:]
if first not in d:
for x in digstolets(rest): yield first + x
return
else:
for x in d[first]:
for y in digstolets(rest): yield x + y
настраивается в зависимости от того, что вы хотите сделать для символов во входной строке, которые не включены между 2
и 9
(эта версия просто повторяет их! -).
Например,
print list(digstolets('1234'))
в этой версии испускает
['1ADG', '1ADH', '1ADI', '1AEG', '1AEH', '1AEI', '1AFG', '1AFH', '1AFI',
'1BDG', '1BDH', '1BDI', '1BEG', '1BEH', '1BEI', '1BFG', '1BFH', '1BFI',
'1CDG', '1CDH', '1CDI', '1CEG', '1CEH', '1CEI', '1CFG', '1CFH', '1CFI']
Редактировать : ОП просит дополнительных объяснений, вот попытка. Функция digstolets
(цифры в буквы) принимает строку цифр digs
и возвращает последовательность строк символов, которые могут быть буквами или «не цифрами». 0
и 1
здесь считаются нецифровыми, потому что они не расширяются в буквы, как пробелы и знаки препинания - только цифры 2
до 9
включают расширение до букв (три варианта в каждой в большинстве случаев четыре в двух случаях, поскольку 7
может расширяться до любого из PQRS
, а 9
может расширяться до любого из WXYZ
).
Во-первых, базовый случай: если ничего не осталось (строка digs
пуста), единственный возможный результат - пустая строка, и все, этот рекурсивный вызов завершен, завершен, капут.
Если digs
не пусто, его можно разбить на «голову», первый символ и «хвост», все остальные (0 или более символов после первого).
«Голова» либо остается на выходе, если она не является цифрой; или расширяется до любой из трех или четырех возможностей, если это цифра. В любом случае, одно, три или четыре возможных расширения головы должны быть объединены с каждым возможным расширением хвоста - откуда рекурсивный вызов, чтобы получить все возможные расширения хвоста (поэтому мы зациклимся на всех возможных расширение хвоста и получение каждого из одного, трех или четырех возможных расширений головы, соединенных с каждым возможным расширением хвоста). А потом, еще раз, вот и все, ребята.
Я не знаю, как выразить это в терминах, которые являются более элементарными - если ОП ЭТО все еще теряется после ЭТОГО, я могу только рекомендовать серьезный, полный обзор всего, что касается рекурсии. Удаление рекурсии в пользу явно поддерживаемого стека не может упростить эту концептуальную экспозицию - в зависимости от используемого языка (было бы приятно услышать о том, с какими языками OP полностью удобен!), Удаление рекурсии может быть важной оптимизацией, но это никогда не концептуальное упрощение ...! -)