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

使用C#实现递归方法寻找指定长度连续数加减组合得到目标数的所有可能

递归实现连续数字加减组合找目标值的思路与方法

嘿,这个需求挺有意思的,我来一步步给你拆解怎么用递归实现它~

核心思路

咱们要解决的问题本质是穷举所有符号组合:除了第一个数字1(只能为正),剩下的每个数字都有两种选择——加或者减。递归刚好适合这种需要遍历所有分支的场景,每一步递归处理一个数字,选好符号后继续往下走,直到处理完所有数字再判断是否符合目标值。

递归的关键状态设计

递归函数需要跟踪三个核心信息,才能清楚每一步的进度:

  • 当前处理到第几个数字(比如current_num,从1开始,到n结束)
  • 目前累计的计算结果(current_sum)
  • 目前已经拼接好的表达式字符串(current_expr)

终止条件

当current_num超过n时,说明所有数字都处理完了:

  • 如果current_sum等于目标值,就把current_expr加入结果列表
  • 如果不等,直接返回,这条分支不符合要求

递归的执行过程

  1. 初始状态:从数字1开始,current_sum就是1,current_expr就是"1"
  2. 对于从2到n的每个数字,我们有两种选择:
    • 加这个数字:新总和是current_sum + current_num,新表达式是current_expr + " + " + str(current_num),然后递归处理下一个数字
    • 减这个数字:新总和是current_sum - current_num,新表达式是current_expr + " - " + str(current_num),然后递归处理下一个数字

可选优化:剪枝减少无效计算

如果想让递归效率更高,可以加个剪枝逻辑:计算剩下未处理数字的总和remaining_sum。如果current_sum + remaining_sum < target(就算剩下的全加也达不到目标),或者current_sum - remaining_sum > target(就算剩下的全减也超过目标),那这条分支肯定不可能得到目标值,直接终止递归就行,不用继续往下走了。

代码实现(Python示例)

def find_combinations(n, target):
    result = []
    
    def backtrack(current_num, current_sum, current_expr):
        # 终止条件:处理完所有数字
        if current_num > n:
            if current_sum == target:
                result.append(f"{current_expr} = {target}")
            return
        
        # 计算剩余数字总和,用于剪枝
        remaining_sum = sum(range(current_num + 1, n + 1))
        
        # 选择加当前数字(剪枝:确保有机会达到目标)
        if current_sum + current_num + remaining_sum >= target:
            backtrack(current_num + 1, current_sum + current_num, f"{current_expr} + {current_num}")
        
        # 选择减当前数字(剪枝:确保有机会达到目标)
        if current_sum - current_num - remaining_sum <= target:
            backtrack(current_num + 1, current_sum - current_num, f"{current_expr} - {current_num}")
    
    # 初始调用:从数字2开始,因为数字1已经作为初始值
    backtrack(2, 1, "1")
    return result

# 测试示例:n=6,target=3
combinations = find_combinations(6, 3)
for combo in combinations:
    print(combo)

示例验证

运行上面的代码,输入n=6、target=3,输出就是你要的结果:

1 + 2 + 3 - 4 - 5 + 6 = 3
1 + 2 - 3 + 4 + 5 - 6 = 3
1 - 2 - 3 - 4 + 5 + 6 = 3

为什么用递归?

递归的优势在于它能非常自然地表达这种分支选择的逻辑,代码结构清晰,不需要手动写多层循环来处理不同长度的数字。尤其是当n变大时,递归的可读性比迭代的穷举写法要好很多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 08:54:08