Найти - Пользователи
Полная версия: Рекурсионный генератор паролей
Начало » Центр помощи » Рекурсионный генератор паролей
1
bi01
Здравствуйте уважаемые посетители и разработчики!
Есть задачка на создание всех возможных паролей методом рекурсии. Так как я в изучении языка новичок, к как не бился не получается решить эту задачу.
Условия - есть произвольный словарь/алфавит символов и есть произвольная длина пароля. Нужно сделать базу всех возможных паролей. Т.е. по сути перебор всех значений (рекурсия по 2-хмерному массиву неопределенной длины), включая(!) отдельные символы алфавита. Например имеем:

alf = ‘abcdefghijklmnopqrstuvwxyz’
count = 2
# тогда всевозможное количество вариантов будет равно:
all_count = count**len(alf) + len(alf)
# Переменная, где будут храниться все значения
allpassw =
# сама рекурсионная функция
def recursion(dic, n):
global allpassw
if n <= 0: return 1
else:
for i in dic: allpassw.append(i)
return allpassw+recursion(dic, n-1)
# Вызываем процедуру
recursion(alf, count)
# Печатаем результат
print allpassw

Второй вариант, который я рассматривал был связан с функциями-генераторами (yield).
Но, к сожалению так ничего не получилось.

Подскажите, как решить эту задачу или где можно почитать об этой теме. Спасибо.
FishHook
Может стоит воспользоваться функциями модуля itertools combinations(), permutations()
fata1ex
def string_permutations(string, prefix=""):
    if len(string) == 1:
        yield prefix + string
    else:
        for idx in xrange(len(string)):
            for perm in string_permutations(string[:idx] + string[idx+1:], prefix+string[idx]):
                yield perm

Функция выводит все перестановки полученной строки. Можно её немного переделать и решить вашу задачу. Вообще, я бы решал эту задачу без рекурсии, а с помощью itertools. Можете привести дополнительный вариант решения.

Если очень грубо, то как-то так. (Не повторять в домашних условиях!!!)
from itertools import combinations_with_replacement as com
from itertools import permutations as perm
alphabet = 'abc'
passwords = { length: set() for length in xrange(1, len(alphabet)+1) }
for password_len in xrange(1, len(alphabet)+1):
	for pre_password in com(alphabet, password_len):
		for password in perm(pre_password): # that sucks
			passwords[password_len].add(''.join(password))
print passwords
bi01
fata1ex и FishHook, спасибо за предоставленный код и ответ - буду разбираться. Также возьму на вооружение указанные библиотеки. В целом задача решилась.
Вот здесь я задал этот же вопрос. Предложили вот такой вариант:

chars = string.ascii_lowercase
passwords = []
def recursion(count, s=""):
    if count <= 0:
        passwords.append(s)
        return
    for c in chars:
        recursion(count - 1, s+c)
recursion(2)
fata1ex
Хороший вариант. Разве что ‘<’ можно заменить на ‘=’ :)
pyuser
bi01
fata1ex и FishHook, спасибо за предоставленный код и ответ - буду разбираться. Также возьму на вооружение указанные библиотеки. В целом задача решилась.
Вот здесь я задал этот же вопрос. Предложили вот такой вариант:

chars = string.ascii_lowercase
passwords = []
def recursion(count, s=""):
    if count <= 0:
        passwords.append(s)
        return
    for c in chars:
        recursion(count - 1, s+c)
recursion(2)

import string
from itertools import product
passwords = ["".join(x) for x in product(string.ascii_lowercase, repeat=2)]
Получите тоже самое, не изобретая велосипеда
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB