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
问题原因
- 递归函数无返回值:
recur函数在else分支没有返回语句,当处理长度大于1的数字列表时,函数执行完默认返回None。处理3个数字时,第二层递归(如处理[2,5])进入else分支,执行后返回None,上层调用x = recur(st[1:])得到None,遍历x时触发错误。 - 数字映射错误:字典中
digits[8]被重复赋值两次,第二次覆盖了第一次,导致数字8对应字母错误(应为['t','u','v'],错误被设为['w','x','y','z'],这部分应该是数字9的映射)。 - 递归逻辑冗余:
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
相关产品推荐
相关产品推荐

