#python #list #recursion
Вопрос:
Я пытаюсь изучить рекурсию и разделяю нечетные и четные значения в двух списках и объединяю их в другой список, как показано ниже:
Код:
def separateNumbers(L): evenList = [] oddList = [] main = [] if len(L)==0: return L if L[0] % 2 == 0: evenList.append(L[0]) separateNumbers(L[1:]) if L[0] % 2 == 1: oddList.append(L[0]) separateNumbers(L[1:]) main.append(evenList) main.append(oddList) return main inputList = [1,2,3,4,5,6,7,8,9,10] L = separateNumbers(inputList) print(L)
Ввод:
L = [1,2,3,4,5,6]
Выход:
[[1,3,5], [2,4,6]]
Четные и нечетные массивы сбрасываются каждый раз при вызове рекурсивной функции, как я могу это исправить?
Попробовал с внутренней функцией:
def separateNumbers(L): evenList = [] oddList = [] main = [] def inner(L): if len(L)==0: return L if L[0] % 2 == 0: evenList.append(L[0]) inner(L[1:]) if L[0] % 2 == 1: oddList.append(L[0]) inner(L[1:]) main.append(evenList) main.append(oddList) return main a = inner(L) return a
Выход:
[[2, 4, 6, 8, 10], [1, 3, 5, 7, 9], [2, 4, 6, 8, 10], [1, 3, 5, 7, 9], [2, 4, 6, 8, 10], [1, 3, 5, 7, 9], [2, 4, 6, 8, 10], [1, 3, 5, 7, 9], [2, 4, 6, 8, 10], [1, 3, 5, 7, 9], [2, 4, 6, 8, 10], [1, 3, 5, 7, 9], [2, 4, 6, 8, 10], [1, 3, 5, 7, 9], [2, 4, 6, 8, 10], [1, 3, 5, 7, 9], [2, 4, 6, 8, 10], [1, 3, 5, 7, 9], [2, 4, 6, 8, 10], [1, 3, 5, 7, 9]]
Комментарии:
1. Создайте вложенную функцию для выполнения фактической рекурсии
2. Я попробовал внутреннюю функцию, но не получил ответа, я показываю изменения в исходном сообщении. Что-то в рекурсии, чего я не понимаю
3. Внутреннее никогда не должно звонить
main.append(oddList)
. Если вы хотите понять свой код, проследите его вручную4. Обычно я отлаживаю и отслеживаю свой код, но с рекурсией даже это не помогает понять
Ответ №1:
Вам не нужна вложенная функция. пробовать:
def separate_numbers(lst): if not lst: # empty list return [], [] odd, even = separate_numbers(lst[1:]) # recursion call if lst[0] % 2: # if the first item is odd return [lst[0], *odd], even else: # if even return odd, [lst[0], *even] lst = [1,2,3,4,5,6,7,8,9,10] print(separate_numbers(lst)) # ([1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
Функция вызывает саму себя, используя хвостовую часть входного списка, получая два списка: odd
для нечетных чисел и even
для четных чисел. Затем он возвращает эти списки после присоединения элемента head lst[0]
к одному из списков.