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

递归法单词拆分:代码拆分与合并调用结果差异问题

嘿,我来帮你搞清楚为什么这两种写法结果差这么大!

问题根源:变量修改与递归参数的误用

你遇到的核心问题其实是有没有修改当前作用域里的st变量,以及递归函数到底用的是哪个st。咱们一步步拆:

1. 拆成两行写为啥有输出?

当你这么写的时候:

st = st[i:]
word_break_recur(dic, st, res )

你先把当前函数里的st替换成了从i位置开始的子串,再把修改后的st传给递归函数。如果你的word_break_recur函数没好好用传入的参数,反而依赖了外部作用域的st变量,那这个修改刚好能让递归一步步缩短st,直到触发终止条件(比如st为空时输出结果)。

而且这种写法还会改变后续循环的上下文:比如原st长度是N,修改后变成N-i,后续循环的range(len(st))会基于新的长度执行,相当于在同一个循环里就处理了剩余的字符串。

2. 合并成一行为啥没输出?

换成这行之后:

word_break_recur(dic, st[i: ], res )

你只是把st[i:]作为临时值传给递归函数,完全没修改当前作用域的原st。这时候如果递归函数没用到传入的参数,还是盯着外部的原st,那递归里的st永远是最初的完整字符串,根本没法缩短到触发终止条件,自然啥输出都没有。

就算递归函数用了传入的参数,两种写法的逻辑也完全不同:

  • 拆两行的写法里,后续循环跟着修改后的st走,相当于迭代+递归混合处理剩余字符串;
  • 合并写法里,循环全程基于初始st,递归处理子串的同时原循环还在遍历原字符串的所有位置,这会导致递归路径根本走不到能输出的终止条件。

怎么改才对?

要解决这个问题,你得做到这两点:

  • 让word_break_recur严格使用传入的st参数,别去依赖外部变量;
  • 递归时直接传切片后的子串,别修改当前作用域的原st,避免打乱循环逻辑。

给你个能正常运行的示例,和你的预期输出匹配:

def word_break_recur(dic, current_st, current_res):
    # 字符串拆完时,输出结果
    if not current_st:
        print(current_res)
        return
    # 尝试所有可能的拆分位置
    for i in range(1, len(current_st)+1):
        prefix = current_st[:i]
        if prefix in dic:
            # 递归处理剩余子串,将当前前缀加入结果列表
            word_break_recur(dic, current_st[i:], current_res + [prefix])

# 调用测试
dic = {"word", "b", "r", "e", "a", "k", "ak", "break", "problem"}
original_st = "wordbreakproblem"
word_break_recur(dic, original_st, [])

这个版本不管怎么传参,逻辑都是一致的,不会再出现无输出的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:32:26