• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • Бесплатный ВЕБИНАР по OSINT с Екатериной Тьюринг: ➡️9 февраля в 19:00 (мск) пройдет урок

    Как безопасно искать информацию в открытых источниках

    🔥 Записаться 🔥

Ошибка в рекурсии

  • Автор темы Автор темы Vlg
  • Дата начала Дата начала

Vlg

Green Team
02.11.2019
117
1
BIT
19
Я точно не знаю, можно ли это назвать рекурсией,так что извините, если ошибся.

Есть код ,задача которой создание списка из слов определенной длинны ,из определенного словаря.Вот пример :

Python:
n=3 #это длинна слова
i=n-1 #для работы с самим словом
AlfaBeta=['a','b','c'] #это наш алфавит
word=AlfaBeta[0]*n #создали слово с длинной n
word=[a for a in word] #слово преобразовали в массив для работы с каждой буквой
AlfaBeta_output=list() #здесь будет сохранены наши слова
def recursion (i,n):
    for alfa in AlfaBeta:
        word[i]=alfa
        AlfaBeta_output.append(''.join(word))
        if i != 0:
           i-=1
           recursion(i,n)
    i+=1
    return True


По-сути должен создаться лист из неповторяющихся слов типа :aaa aab aac aba abb ... ccc
Но получается ахинея. Я уверен, что ошибка элементарная, но я её не вижу.
Вроде логика безупречна, но она дала сбой. Помогите
 

Вложения

  • aebd286b-eeaf-420d-8d98-47c8ffae582e.jpg
    aebd286b-eeaf-420d-8d98-47c8ffae582e.jpg
    34,9 КБ · Просмотры: 485
Последнее редактирование:
И ещё. У меня есть цикл создающий массив различных слов длинной от 1 до х. Массив становится слишком большим. Я решил, что цикл будет прерываться чтобы записать массив в фаил, а этот массив опустошаю. Выходит все слишком крупно и не красиво. Можешь что-то подсказать?
 
Ты будешь смеяться, но это не работает. Просто из листа ['a','b','c'] создаётся массив из одного элемента ['abc']
Да, код по ссылке выше немного не то делает. Можно так:
Код:
>> import itertools
>> li = ['a', 'b', 'c']
>> print(set(itertools.permutations(li, len(li))))
{('c', 'b', 'a'), ('c', 'a', 'b'), ('b', 'c', 'a'), ('b', 'a', 'c'), ('a', 'b', 'c'), ('a', 'c', 'b')}
 
Да, код по ссылке выше немного не то делает. Можно так:
Код:
>> import itertools
>> li = ['a', 'b', 'c']
>> print(set(itertools.permutations(li, len(li))))
{('c', 'b', 'a'), ('c', 'a', 'b'), ('b', 'c', 'a'), ('b', 'a', 'c'), ('a', 'b', 'c'), ('a', 'c', 'b')}
Коню в зубы не заглядывают, но ты используешь set, а он ведь set, а не лист, если я его переведу в лист, то теряется порядок.
 
Коню в зубы не заглядывают, но ты используешь set, а он ведь set, а не лист, если я его переведу в лист, то теряется порядок.
Ну сделай так и будет список строк:
Python:
import itertools

li = ['a', 'b', 'c']
mut = itertools.permutations(li, len(li))
out = []
for i in mut:
    out.append(''.join(list(i)))
print(out)

Лучше скажи где ошибка в моем цикле.
Если вкратце, то можно так: print(list(set(AlfaBeta_output)))
 
Последнее редактирование:
Ну сделай так и будет список строк:
Python:
import itertools

li = ['a', 'b', 'c']
mut = itertools.permutations(li, len(li))
out = []
for i in mut:
    out.append(''.join(list(i)))
print(out)


Если вкратце, то можно так: print(list(set(AlfaBeta_output)))
Твой вариант с print(list(se... Не получается, так как сам цикл не перебирает все варианты. Пожалуйста, просмотри его. Там маленькая ошибка, а найти ее не могу.
 
Твой вариант с print(list(se... Не получается, так как сам цикл не перебирает все варианты. Пожалуйста, просмотри его. Там маленькая ошибка, а найти ее не могу.
Мне сложно разобрать логику его работы :)
И я не понимаю, зачем генерировать строку и затем разбивать её в список для последующей замены елементов, если можно собирать её налету:
Python:
chars_list = ['a', 'b', 'c']
tmp_str = ''
for i in chars_list:
    tmp_str += i
    print(tmp_str)
Попробуй переписать это во вложенных циклах, выдёргивая по индексу елементы из первоначального списка. Мб так будет проще.
 
Мне сложно разобрать логику его работы :)
И я не понимаю, зачем генерировать строку и затем разбивать её в список для последующей замены елементов, если можно собирать её налету:
Python:
chars_list = ['a', 'b', 'c']
tmp_str = ''
for i in chars_list:
    tmp_str += i
    print(tmp_str)
Попробуй переписать это во вложенных циклах, выдёргивая по индексу елементы из первоначального списка. Мб так будет проще.
Уровень ошибки " Особый кретин" . Я нашел ошибку. Во-первых функция не возвращала переменную i. Из-за чего функция последующей(предыдущей) вызванная рекурсией неправильно ориентировалась. Во-вторых, значение i стремилось к нулю и только потом выполнялся цикл, а должен был наоборот. Переменная должна увеличиться до len(word)-1 и отсюда начинать перебор. Фух, я же сказал, что ошибка элементарная.
 
Мне сложно разобрать логику его работы :)
И я не понимаю, зачем генерировать строку и затем разбивать её в список для последующей замены елементов, если можно собирать её налету:
Python:
chars_list = ['a', 'b', 'c']
tmp_str = ''
for i in chars_list:
    tmp_str += i
    print(tmp_str)
Попробуй переписать это во вложенных циклах, выдёргивая по индексу елементы из первоначального списка. Мб так будет проще.
Мой цикл все равно не работает. А твой вариант с itertools не работает в том случае, если длинна слова больше длинны алфавита. Не знаешь как это исправить?
 
Если я правильно понял твою задачу то будет что-то вроде этого.

Python:
def generate_combination(user_alphabet: list, user_word_len: int) -> str:
    for iterator in range(len(user_alphabet) ** user_word_len):
        result: str = ""
        for _ in range(user_word_len):
            iterator, index = divmod(iterator, len(user_alphabet))
            result += user_alphabet[index]
        yield result


word_len: int = 3
alphabet: list = ['a', 'b', 'c']
alphabet_output: list = []

for combination_option in generate_combination(user_alphabet=alphabet, user_word_len=word_len):
    alphabet_output.append(combination_option)
alphabet_output.sort()
print(alphabet_output)
 
Последнее редактирование:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!