функция рекурсии, повторяющаяся слишком часто

#python #recursion

Вопрос:

Относительно рано в моем путешествии по python и кодированию в целом. Я наткнулся на пример вопроса, который задает вопрос, который должен сгладить список списков. Теперь, сколько существует списков списков, я бы не знал. Что приводит меня к выполнению моей первой попытки рекурсии:

 array = [[1,2,3,['a','b','c'],4],'d', [5,6],[7],8,9]
flattened = []

def flattenme (iteritem):
    
    for item in iteritem:
        if isinstance(item, Iterable) or isinstance(item, (str,bytes)):
            flattenme(item)
        else:
            flattened.append(item)
 

Когда я запускаю это с

 print(f"flatten method: {list(flattenme(array))}")
 

Я получаю ошибку:

Ошибка рекурсии: максимальная глубина рекурсии превышена по сравнению

Не должен

 flattenme(item)
 

в последний раз, когда это вызывается, просто верните элемент, не входящий в список? Я не уверен, что происходит не так и где мое понимание рекурсии терпит неудачу.

Комментарии:

1. Если элемент представляет собой строку, вы должны добавить его. не вызывайте функцию снова…

2. Строки при повторении создают строки меньшего размера. Если вы предоставите строку, то вы никогда не достигнете «дна». У Python нет char типа.

3. Здесь слишком много скобок. Код вообще не запускается

4. flattened не определено.

5. Метод ничего не возвращает, поэтому вы не можете его распечатать.

Ответ №1:

Строки и байты можно повторять. В частности, строки дают строки длиной 1 при повторении.

Это означает, что ваш код повторяется бесконечно.

Кроме того, ваша функция ничего не возвращает.

Вот мое предложение, которое создает flattenme генератор, который не разделяет строки:

 array = [[1,2,3,['a','b','c'],4],'d', [5,6],[7],8,9]

def flattenme (iteritem):
    for item in iteritem:
        if isinstance(item, Iterable) and not isinstance(item, (str,bytes)):
            yield from flattenme(item)
        else:
            yield item