所以我用python实现了一个块交换算法。
我遵循的算法如下:
初始化A= arr0..d-1和B= arrd..n- 1 )执行以下操作,直到A的大小等于B的大小
a)如果A较短,则将B分为B1和Br,使得Br与A的长度相同。交换A和Br以将ABlBr变为BrBlA。现在A在它的最后位置,所以重复B的片段。
b)如果A较长,则将A划分为A1和Ar,使得Al与B的长度相同,将A1和B互换,将AlArB转换为BArAl。现在B在它的最后位置,所以重复A的片段。
2)最后,当A和B大小相等时,对它们进行块交换。
同样的算法已经在这个网站上用C语言实现-- Array Rotation
我的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)
我在每个阶段都得到了正确的值,但递归函数调用没有返回预期的结果,而且我似乎无法理解原因。有人能解释一下我的递归出了什么问题吗?还有什么是可能的替代方案。
发布于 2017-10-20 17:50:49
在Python中,一个简单而简明的数组循环语法是
arr = arr[numOfRotations:]+arr[:numOfRotations]
示例:
arr = [1,2,3,4,5]
rotations = 4
then
arr = arr[4:]+arr[:4]
给了我们
5,1,2,3,4
发布于 2013-06-28 02:20:50
您是否真的需要实现数据块交换,或者只是希望轮换阵列?在python中,您可以使用以下命令执行CW和CWW旋转
zip(*arr[::-1])
和
zip(*arr)[::-1]
发布于 2013-06-28 02:25:19
我希望当你将一个片段传递给你的递归调用时,你不会再传递相同的变量了。尝试将整个和切片的上下限作为附加参数传递给函数。
例如,考虑这个函数:
def silly(z):
z[0] = 2
我刚刚尝试了以下几种方法:
>>> z = [9,9,9,9,9,9]
>>> silly(z)
>>> z
[2, 9, 9, 9, 9, 9]
>>> silly(z[3:])
>>> z
[2, 9, 9, 9, 9, 9]
您可以看到,对切片所做的修改未保留在完整阵列中
出于好奇心,你得到了什么输出&你期望什么输出?
https://stackoverflow.com/questions/17350330
复制相似问题