问题描述
有人可以向我解释这种逐步反转数组的递归方法吗?
# Recursive python program to reverse an array
# Function to reverse A[] from start to end
def reverseList(A,start,end):
if start >= end:
return
A[start],A[end] = A[end],A[start]
reverseList(A,start+1,end-1)
# Driver function to test above function
A = [1,2,3,4,5,6]
print(A)
reverseList(A,5)
print("Reversed list is")
print(A)
输出:
1 2 3 4 5 6
反向列表是:
6 5 4 3 2 1
解决方法
您正在做的是从函数的两端开始,交换开始和结束索引,然后将两个索引向中心移近一点,一旦索引相遇,函数就会返回。所以这是函数每次被调用时所做的事情:
1 2 3 4 5 6 -> 6 2 3 4 5 1 -> 6 5 3 4 2 1 -> 6 5 4 3 2 1
,该方法获取数组的第一个元素(索引为 start
)和最后一个元素(索引为 end
),并交换它们。然后它获取第二个元素和倒数第二个元素并交换它们。它一直持续到您到达中间,其中 start
索引小于 end
索引。
这是通过创建两个指针来工作的,一个在列表的第一个,一个在列表的末尾 start
和 end
,让我们称这对为“切换”指针,它指示应该切换项目的位置,在我们切换这些元素后,我们向每个方向移动一步(开始 -> 结束)&(结束 -> 开始),我们一直这样做直到开始大于结束,这意味着我们完成了列表。
使用 for 循环的相同实现
for i in range(int(len(A)/2)):
A[i],A[len(A) - 1 - i] = A[len(A) - 1 -i],A[i]
,
这是一种解释,粗体数字是变化。
开始 = 0,结束 = 5,A = 1 2 3 4 5 6(输入)
start = 0,end = 5,A = 6 2 3 4 5 1(从 A 交换第 0 个和第 5 个元素)
start = 1,end = 4,A = 6 2 3 4 5 1(输入第二次)
start = 1,end = 4,A = 6 5 3 4 2 1(交换 A 中的第 1 个和第 4 个元素)
start = 2,end = 3,A = 6 5 4 3 2 1 (第三次输入)
start = 2,end = 3,A = 6 5 4 3 2 1 (交换 A 中的第二个和第三个元素)
start = 3,end = 2,A = 6 5 4 3 2 1 (第四次输入)
原样返回,你得到最终的 A = 6 5 4 3 2 1