递归法单词拆分:代码拆分与合并调用结果差异问题
嘿,我来帮你搞清楚为什么这两种写法结果差这么大!
问题根源:变量修改与递归参数的误用
你遇到的核心问题其实是有没有修改当前作用域里的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
相关产品推荐
相关产品推荐

