You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何递归反转列表中指定范围[i,j]内的元素?

递归反转列表指定索引范围的元素

问题分析

你提供的原代码是递归反转整个列表,现在需要修改为仅反转列表中索引i到j范围内的元素(以你给出的例子为准,这里默认i和j是1-based索引,若需0-based可调整)。

实现思路

递归的核心思路是交换范围两端的元素,然后递归处理中间的子范围,直到范围的起始索引大于等于结束索引(无需再反转)。为了不修改原列表,每次递归都会创建列表副本进行操作。

代码实现

处理1-based索引的版本

def revlist(l, i, j):
    # 将1-based索引转换为Python默认的0-based索引
    i -= 1
    j -= 1
    # 基线条件:索引越界或无需反转时,返回原列表的副本
    if i >= j or i < 0 or j >= len(l):
        return l.copy()
    # 创建列表副本,避免修改原列表
    new_list = l.copy()
    # 交换当前范围两端的元素
    new_list[i], new_list[j] = new_list[j], new_list[i]
    # 递归反转中间的子范围
    return revlist(new_list, i + 1, j - 1)

测试示例

original_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
result = revlist(original_list, 2, 5)
print(result)  # 输出: [1, 5, 4, 3, 2, 6, 7, 8, 9]

0-based索引的版本(无需转换)

如果你的索引本来就是0-based,可以直接使用以下版本:

def revlist(l, i, j):
    if i >= j or i < 0 or j >= len(l):
        return l.copy()
    new_list = l.copy()
    new_list[i], new_list[j] = new_list[j], new_list[i]
    return revlist(new_list, i + 1, j - 1)

调用时传入revlist(original_list, 1, 4)即可得到相同结果。

另一种递归实现思路(基于切片)

除了交换两端的方式,也可以通过切片拆分列表,递归反转中间子列表后再拼接:

def revlist(l, i, j):
    # 基线条件:无需反转
    if i >= j:
        return l
    # 拆分列表为三部分:前i个元素、中间待反转部分、后j+1到末尾的元素
    # 递归反转中间子列表,再拼接所有部分
    return l[:i] + [l[j]] + revlist(l[i+1:j], 0, len(l[i+1:j])-1) + [l[i]] + l[j+1:]

内容的提问来源于stack exchange,提问作者Malum Phobos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 14:50:39