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

修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:50:37