Как создать рекурсивный разделитель?

#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] к одному из списков.