使用递归对数组进行反转操作

1. 问题描述

给定一个整数数组 arr,要求使用递归 的方式对数组进行反转操作。变量的初始值为 startingIndex = 0,表示交换操作从数组的第一个元素开始。

测试用例 1:

  • 输入:起始索引 = 0,arr = [1, 2, 3, 4, 5]
  • 预期输出:[5, 4, 3, 2, 1]

2. 解题思路

递归反转数组的核心思想是:每次递归交换首尾两个元素,然后缩小问题规模。

具体步骤如下:

  1. 定义递归函数 reverseArray(arr, start, end),其中 start 表示当前要交换的左边界索引,end 表示右边界索引。
  2. 递归的终止条件:当 start >= end 时,说明所有元素已经交换完毕,停止递归。
  3. 交换 arr[start] 和 arr[end]。
  4. 递归调用 reverseArray(arr, start + 1, end - 1),继续处理剩余部分。

3. 代码实现

3.1 Java 实现

java 复制代码
public class ArrayReversal {

    // 递归反转数组
    public static void reverseArray(int[] arr, int start, int end) {
        // 终止条件:左边界 >= 右边界时停止
        if (start >= end) {
            return;
        }

        // 交换首尾元素
        int temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;

        // 递归处理剩余部分
        reverseArray(arr, start + 1, end - 1);
    }

    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        int startingIndex = 0; // 起始索引为 0

        // 调用递归反转
        reverseArray(arr, startingIndex, arr.length - 1);

        // 输出结果
        System.out.print("反转后的数组:[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]);
            if (i < arr.length - 1) {
                System.out.print(", ");
            }
        }
        System.out.println("]");
    }
}

运行结果:

复制代码
反转后的数组:[5, 4, 3, 2, 1]

3.2 Java 实现(简化版)

java 复制代码
public class ArrayReversal {

    // 递归反转数组
    public static void reverseArray(int[] arr, int start, int end) {
        // 终止条件:左边界 >= 右边界时停止
        if (start >= end) {
            return;
        }

        // 交换首尾元素
        int temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;

        // 递归处理剩余部分
        reverseArray(arr, start + 1, end - 1);
    }

    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        int startingIndex = 0; // 起始索引为 0

        // 调用递归反转
        reverseArray(arr, startingIndex, arr.length - 1);

        // 输出结果
        System.out.print("反转后的数组:[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]);
            if (i < arr.length - 1) {
                System.out.print(", ");
            }
        }
        System.out.println("]");
    }
}

运行结果:

复制代码
反转后的数组:[5, 4, 3, 2, 1]

4. 递归过程图解

以 arr = [1, 2, 3, 4, 5] 为例,递归调用过程如下:

递归层级 start end 交换前数组 交换后数组
第 1 层 0 4 1, 2, 3, 4, 5 5, 2, 3, 4, 1
第 2 层 1 3 5, 2, 3, 4, 1 5, 4, 3, 2, 1
第 3 层 2 2 5, 4, 3, 2, 1 终止(start >= end)

5. 复杂度分析

  • 时间复杂度: O(n),其中 n 为数组长度。每个元素最多被交换一次,递归调用 n/2 次。
  • 空间复杂度: O(n),递归调用栈的深度为 n/2,因此空间复杂度为 O(n)。

6. 总结

使用递归反转数组的关键在于:

  1. 明确终止条件 :start >= end 时停止递归。
  2. 缩小问题规模 :每次交换首尾元素后,将区间缩小为 [start + 1, end - 1]。
  3. 初始值 :startingIndex = 0 表示从数组第一个元素开始交换。

递归反转数组虽然直观,但由于空间复杂度为 O(n),在处理超大数组时可能不如双指针迭代法高效。不过作为递归思想的经典练习,它非常适合帮助理解递归的「递推 + 回归」过程。

相关推荐
写后端的胖头鱼6 小时前
一文详解B+树原理(附场景+示例)
数据结构·b树
怕浪猫8 小时前
RAG 面试 6 连问,从原理到优化全部覆盖
python·算法·面试
无线通信科研笔记8 小时前
IEEE TVT 2026 论文精读与完整复现|相位误差如何重塑近场 RIS 的幅相响应
论文阅读·人工智能·python·算法·论文笔记
daidaidaiyu8 小时前
ThingsBoard 集群的核心逻辑源码分析
java
mmmmath_39 小时前
二叉树の递归遍历
算法
All for pursuit.9 小时前
【位运算-1】338.比特位计数
数据结构·c++·算法·leetcode
我可能是个假开发9 小时前
FTP Unicode 文件名导致 `550` 的问题分析与解决方案
java·开发语言·spring
caoerzhong10 小时前
中小企业上 WMS 该先上哪几块:JeeWMS 开源 Java 仓库管理系统的分批上线清单
java·python·开源
小师兄吃牛肉10 小时前
C语言中的nullptr有必要吗
c语言·c++·算法
【JAVA】玩家11 小时前
Spring核心原理全解析:从零到生产实战
java·后端·spring