Итак, я реализую алгоритм обмена блоками в python.
Алгоритм, которым я следую, таков:
Инициализировать A = arr[0..d-1] и B = arr[d..n-1] 1) Делайте следующее, пока размер A не станет равным размеру B
a) Если A короче, разделите B на Bl и Br так, чтобы Br был той же длины, что и A. Поменяйте местами A и Br, чтобы преобразовать ABlBr в BrBlA. Теперь A находится на своем последнем месте, поэтому повторяйте части B.
b) Если A длиннее, разделите A на Al и Ar так, чтобы Al был той же длины, что и B. Поменяйте местами Al и B, чтобы заменить AlArB на BArAl. Теперь B находится на своем последнем месте, поэтому повторяйте части A.
2) Наконец, когда A и B имеют одинаковый размер, поменяйте их местами.
Тот же алгоритм был реализован в C на этом веб-сайте — Вращение массива а>
Мой код Python для того же самого
a = [1,2,3,4,5,6,7,8]
x = 2
n = len(a)
def rotate(a,x):
n = len(a)
if x == 0 or x == n:
return a
if x == n -x:
print(a)
for i in range(x):
a[i], a[(i-x+n) % n] = a[(i-x+n) % n], a[i]
print(a)
return a
if x < n-x:
print(a)
for i in range(x):
a[i], a[(i-x+n) % n] = a[(i-x+n) % n], a[i]
print(a)
rotate(a[:n-x],x)
else:
print(a)
for i in range(n-x):
a[i], a[(i-(n-x) + n) % n] = a[(i-(n-x) + n) % n] , a[i]
print(a)
rotate(a[n-x:], n-x)
rotate(a,x)
print(a)
Я получаю правильные значения на каждом этапе, но рекурсивный вызов функции не возвращает ожидаемого результата, и я не могу понять причину. Может кто-нибудь объяснить, что не так с моей рекурсией? и какая может быть возможная альтернатива.