修改sums函数返回列表长度触发TypeError错误的技术问询
问题原因分析
你遇到的TypeError: 'int' object is not iterable,核心问题在于递归调用的返回值类型不匹配:
- 原函数的递归逻辑依赖于
sums(items[1:])返回可迭代的列表,才能执行for x in sums(items[1:])循环。 - 当你把函数返回值改成
len(new_list)(整数)后,递归调用sums(items[1:])会返回整数,而for循环无法迭代整数类型,直接触发错误。
举个具体执行流程的例子:
处理输入[1,2,3]时,第一次调用sums([1,2,3])会触发递归调用sums([2,3]),而sums([2,3])又会调用sums([3])。如果改成返回长度,sums([3])会返回1(原逻辑中items长度为1时返回items即[3],长度是1),此时sums([2,3])里的for x in sums(items[1:])就变成for x in 1,这显然不符合迭代要求。
两种修复方案
方案1:保持递归返回列表,主函数取长度
这是最简单的修改方式,无需改动递归核心逻辑,仅在打印时取列表长度:
def sums(items): if len(items) == 1: return items else: new_list = [] for i in items: new_list.append(i) for x in sums(items[1:]): new_list.append(x) new_list.append(x + items[0]) new_list = list(set(new_list)) return new_list if __name__ == "__main__": print(len(sums([1, 2, 3]))) # 输出6 print(len(sums([2, 2, 3]))) # 输出5
方案2:修改递归逻辑,直接返回长度
如果希望递归函数本身返回长度,可调整逻辑,用集合存储所有不同和,最后返回集合长度:
def sums_length(items): def helper(sub_items): if len(sub_items) == 1: return {sub_items[0]} sub_set = helper(sub_items[1:]) new_set = sub_set.copy() new_set.add(sub_items[0]) for num in sub_set: new_set.add(num + sub_items[0]) return new_set return len(helper(items)) if __name__ == "__main__": print(sums_length([1, 2, 3])) # 输出6 print(sums_length([2, 2, 3])) # 输出5
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

