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

Python递归实现电话号码字母组合时出现TypeError问题求助

电话号码字母组合递归代码的TypeError问题排查

问题场景

解决LeetCode电话号码字母组合问题时,输入2个数字代码运行正常,但输入3个数字时触发TypeError: 'NoneType' object is not iterable错误。

原代码

digits = dict()
digits[2] = ['a', 'b', 'c']
digits[3] = ['d', 'e', 'f']
digits[4] = ['g', 'h', 'i']
digits[5] = ['j', 'k', 'l']
digits[6] = ['m', 'n', 'o']
digits[7] = ['p', 'q', 'r', 's']
digits[8] = ['t', 'u', 'v']
digits[8] = ['w', 'x', 'y', 'z']

st = [4, 2, 5]

def recur(st):
  if len(st) == 1:
    return digits[st[0]]
  else:
    for i in st:
      for j in digits[i]:
        x = recur(st[1:])
        for z in x:
          print(j + z)

recur(st)

错误信息

TypeError                                 Traceback (most recent call last)
<ipython-input-2-f5b34b89f5ce> in <module>
     21           print(j + z)
     22 
---> 23 recur(st)

<ipython-input-2-f5b34b89f5ce> in recur(st)
     18       for j in digits[i]:
     19         x = recur(st[1:])
---> 20         for z in x:
     21           print(j + z)
     22 

TypeError: 'NoneType' object is not iterable

问题原因

  1. 递归函数无返回值:recur函数在else分支没有返回语句,当处理长度大于1的数字列表时,函数执行完默认返回None。处理3个数字时,第二层递归(如处理[2,5])进入else分支,执行后返回None,上层调用x = recur(st[1:])得到None,遍历x时触发错误。
  2. 数字映射错误:字典中digits[8]被重复赋值两次,第二次覆盖了第一次,导致数字8对应字母错误(应为['t','u','v'],错误被设为['w','x','y','z'],这部分应该是数字9的映射)。
  3. 递归逻辑冗余:else分支中for i in st会遍历当前列表所有元素,和递归处理st[1:]的逻辑重复,导致不必要的循环和逻辑混乱。

修正后的代码

# 修正数字映射,区分8和9的对应字母
digits = {
    2: ['a', 'b', 'c'],
    3: ['d', 'e', 'f'],
    4: ['g', 'h', 'i'],
    5: ['j', 'k', 'l'],
    6: ['m', 'n', 'o'],
    7: ['p', 'q', 'r', 's'],
    8: ['t', 'u', 'v'],
    9: ['w', 'x', 'y', 'z']
}

st = [4, 2, 5]

def recur(st):
    if len(st) == 1:
        return digits[st[0]]
    else:
        # 获取第一个数字对应的字母列表
        first_chars = digits[st[0]]
        # 递归获取剩余数字的所有组合
        rest_combinations = recur(st[1:])
        # 生成所有字母组合并返回
        return [char + combo for char in first_chars for combo in rest_combinations]

# 获取结果并打印
result = recur(st)
print(result)

修正说明

  • 修复了数字8和9的映射错误,避免覆盖。
  • 调整递归逻辑:else分支专注于当前第一个数字与剩余数字组合的笛卡尔积,去除冗余循环。
  • 确保递归函数每一层都有返回值,避免出现None。
  • 使用列表推导式简洁生成组合结果,符合LeetCode返回结果的要求,而非直接打印。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:05:18