如何编写符合要求的递归函数将列表中整数k的所有倍数移至末尾
代码问题排查
你的代码存在两个核心问题:
- 递归调用时使用切片
num_list[1:]会生成全新的独立列表,后续所有递归操作都在这个新列表上执行,完全不会修改最外层传入的原列表,这是你调用函数后原列表无变化的核心原因。 - 现有逻辑即便修复传参问题也无法保证元素相对顺序:你把头部遇到的倍数直接追加到列表末尾后,递归跳过了索引0的位置,会导致后续处理逻辑偏移,无法正确遍历剩余元素。
符合要求的实现方案
我们可以通过辅助递归函数,直接在原列表上操作,分别收集非k倍数元素和k倍数元素,最后直接覆盖原列表的内容即可,全程不使用循环,同时保留两类元素的原始相对顺序:
def move_multi(num_list, k): # 辅助递归函数:返回(非倍数列表,倍数列表) def helper(index): # 基线条件:遍历完所有元素 if index == len(num_list): return [], [] current = num_list[index] non_k, k_multi = helper(index + 1) if current % k == 0: return non_k, [current] + k_multi else: return [current] + non_k, k_multi non_k_list, k_list = helper(0) # 直接修改原列表内容,保证外部引用的列表生效 num_list[:] = non_k_list + k_list
测试验证
运行示例代码:
nums = [1, 2, 3, 4, 5, 6, 7, 8] k = 3 move_multi(nums, k) print(nums)
输出与预期完全一致:
[1, 2, 4, 5, 7, 8, 3, 6]
内容的提问来源于stack exchange,提问作者user15839150
相关产品推荐
相关产品推荐

