Неправильная работа рекурсии

Я пытался написать 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 шт):

Автор решения: Zhihar

замените свой код

new = (z + x for z in ls for x in chars)  # создаем новый генератор состоящий из всех 

на

new = [z + x for z in ls for x in chars]  # создаем новый генератор состоящий из всех
→ Ссылка
Автор решения: Skeggi

Всё дело в том, что вы используете генератор, а генератор - не список. Он не хранит те значения, которые он обработал. При значениях 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)


Что я сделал:
  1. Упростил sys.setrecursionlimit до setrecursionlimit, импортировав его в начале, не импортируя весь модуль sys.
  2. Сменил названия переменных на более понятные и правильные.
  3. Добавил приглашение ввода пароля и приставку Подобрано:.
  4. Самое главное! Сделал генератор списка, а не кортежа, почему - объяснили в этом ответе.

Кстати, я работаю в Pydroid 3 и у меня писало Segmentation fault вместо вашей ошибки.

→ Ссылка