Неправильная работа рекурсии
Я пытался написать Python код, который будет подбирать пароль. Вот сам код:
import sys
password = input()
chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] # список допустимых символов
sys.setrecursionlimit(100000)
def selection(a, ls): # 1 аргумент - пароль, 2 - список символов
for i in ls:
print(i)
if i == a: # проверяем, является ли правильным
print(i)
quit()
new = (z + x for z in ls for x in chars) # создаем новый генератор состоящий из всех
# возможных вариация суммы элемента списка, и символа
selection(a, new) # вызываем функцию с этим генератором
selection(password, chars)
Но почему-то он выводит только числа от 00 до 99, останавливается на секунды 3, а затем pycharm пишет: Process finished with exit code -1073741571 (0xC00000FD) Я ни как не могу найти тут ошибку, помогите если сможете
Ответы (3 шт):
замените свой код
new = (z + x for z in ls for x in chars) # создаем новый генератор состоящий из всех
на
new = [z + x for z in ls for x in chars] # создаем новый генератор состоящий из всех
Всё дело в том, что вы используете генератор, а генератор - не список. Он не хранит те значения, которые он обработал. При значениях 0 - 9 функция берет значения из списка chars, 10 - 99 вторая цифра берется из генератора. Дальнейший код просит генерировать значения, обращаясь к отработавшему генератору new = (z + x for z in ls for x in chars). Если вы в своём коде зададите new = [z + x for z in ls for x in chars], т.е. список, то код будет работать.
Итак, вот переделанный код:
from sys import setrecursionlimit
password = input('Пароль: ')
chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
setrecursionlimit(100000)
def bruteforce(passwd, charlist):
for bf in charlist:
print(bf)
if bf == passwd:
print('Подобрано:', bf)
quit()
bf_chars = [i + j for i in charlist for j in chars]
print(bf_chars)
bruteforce(passwd, bf_chars)
bruteforce(password, chars)
Что я сделал:
- Упростил
sys.setrecursionlimitдоsetrecursionlimit, импортировав его в начале, не импортируя весь модульsys. - Сменил названия переменных на более понятные и правильные.
- Добавил приглашение ввода пароля и приставку
Подобрано:. - Самое главное! Сделал генератор списка, а не кортежа, почему - объяснили в этом ответе.
Кстати, я работаю в Pydroid 3 и у меня писало Segmentation fault вместо вашей ошибки.