#python
#python
Вопрос:
Я пытаюсь выполнить рекурсивный вызов для подсчета количества инверсий списка чисел
например: [3,1,2,4]
Две инверсии — это (3,1)
и (3,2)
.
Таким образом, алгоритм должен возвращать 2.
Я попробовал это с помощью метода merge_sort .
def merge(x,y,last_inversion_sum):
x_length = len(x)
y_length = len(y)
n = x_length y_length
i=j=0
inversion = 0
merged_list = []
while i<x_length and j <y_length:
if x[i]>y[j]:
merged_list.append(y[j])
j =1
else:
merged_list.append(x[i])
i =1
inversion =1
if i == x_length:
merged_list.extend(y[j:])
else:
merged_list.extend(x[i:])
inversion = inversion last_inversion_sum
return merged_list,inversion
def compute_inversion(a):
array_length = len(a)
if array_length<=1: return 0
L,inversion1 = compute_inversion(a[:int(array_length / 2)])
R,inversion2 = compute_inversion(a[int(array_length / 2):])
inversion_sum = inversion1 inversion2
return merge(L,R,inversion_sum)
lizt = [3,2,1,5]
_,inversion_num = compute_inversion(lizt)
print(inversion_num)
Выскочила ошибка:
Traceback (most recent call last):
File "D:/A.LXR/inversion.py", line 40, in <module>
_,inversion_num = compute_inversion(lizt)
File "D:/A.LXR/inversion.py", line 32, in compute_inversion
L,inversion1 = compute_inversion(a[:int(array_length / 2)])
File "D:/A.LXR/inversion.py", line 32, in compute_inversion
L,inversion1 = compute_inversion(a[:int(array_length / 2)])
TypeError: cannot unpack non-iterable int object
Process finished with exit code 1
Где что-то пошло не так?
Кто-нибудь может мне помочь?
Комментарии:
1. вы возвращаете
int
объект, а не кортеж, когдаarray_legnth <= 1
, следовательно, при его распаковке вы получаете эту ошибку2. почему вы вызвали функцию compute_inversion внутри нее?
Ответ №1:
Ваша функция compute_inversion(a) всегда должна возвращать значения одного и того же типа, список и int, даже когда array_length<=1:
Вы могли бы сделать это так:
def compute_inversion(a):
array_length = len(a)
if array_length<=1: return a, 0
L,inversion1 = compute_inversion(a[:int(array_length / 2)])
R,inversion2 = compute_inversion(a[int(array_length / 2):])
inversion_sum = inversion1 inversion2
return merge(L,R,inversion_sum)
Теперь это работает, и результат :
3