C语言中带数组参数的递归函数实现需求咨询
实现符合规则的递归数组筛选函数
没问题,我来帮你搞定这个递归函数。首先得把需求拆解清楚,咱们先把规则转换成更直白的目标:
- 当k为正:我们需要收集正数,最多收集
min(k, n)个(k小于n就取k个,否则取所有正数) - 当k为负:我们需要收集负数,最多收集
min(abs(k), n)个(绝对值小于n就取|k|个,否则取所有负数)
递归的核心思路是每次处理数组的第一个元素,判断它是否符合当前要收集的类型,同时跟踪还需要收集多少个元素、剩余多少数组元素要处理。话不多说,直接上Python实现(逻辑通用,你可以轻松转成其他语言):
def filter_recursive(a, n, k): # 终止条件:没有元素要处理,或者已经收集够了目标数量 if n == 0 or (k > 0 and k <= 0) or (k < 0 and abs(k) <= 0): return [] current_num = a[0] rest_array = a[1:] rest_n = n - 1 if k > 0: # 收集正数的分支 if current_num > 0: # 当前元素符合条件,加入结果后递归处理剩余数组,需要收集的数量减1 return [current_num] + filter_recursive(rest_array, rest_n, k - 1) else: # 当前元素不符合,跳过并继续递归 return filter_recursive(rest_array, rest_n, k) else: # 收集负数的分支 if current_num < 0: # 当前元素符合条件,加入结果后递归处理剩余数组,需要收集的数量(绝对值)减1 return [current_num] + filter_recursive(rest_array, rest_n, k + 1) else: # 当前元素不符合,跳过并继续递归 return filter_recursive(rest_array, rest_n, k)
代码细节说明
- 终止条件:当剩余元素个数
n为0,或者已经收集够了目标数量(k减到0或加到0),就返回空数组结束递归。 - 分支逻辑:
- k为正时,只筛选正数:遇到正数就加入结果,同时将k减1(表示还需收集的数量减少);遇到非正数直接跳过,递归处理剩余数组。
- k为负时,只筛选负数:逻辑和正数分支一致,遇到负数就加入结果,将k加1(因为k是负数,加1等价于绝对值减1)。
测试验证
咱们用几个例子验证逻辑是否符合要求:
- 输入
filter_recursive([3, -2, 5, -1], 4, 2)→ 返回前2个正数:[3, 5] - 输入
filter_recursive([3, -2, 5, -1], 4, -3)→ 数组仅2个负数,返回所有负数:[-2, -1] - 输入
filter_recursive([-5, 2, -3, 7], 4, 5)→ k≥n,返回所有正数:[2, 7] - 输入
filter_recursive([-5, 2, -3, 7], 4, -5)→ |k|≥n,返回所有负数:[-5, -3]
内容的提问来源于stack exchange,提问作者crylikeacanary
相关产品推荐
相关产品推荐

