如何递归反转列表中指定范围[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
相关产品推荐
相关产品推荐

