逐步反转数组的递归方法

问题描述

有人可以向我解释这种逐步反转数组的递归方法吗?

# 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 索引。

,

这是通过创建两个指针来工作的,一个在列表的第一个,一个在列表的末尾 startend,让我们称这对为“切换”指针,它指示应该切换项目的位置,在我们切换这些元素后,我们向每个方向移动一步(开始 -> 结束)&(结束 -> 开始),我们一直这样做直到开始大于结束,这意味着我们完成了列表。

使用 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