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

数字各位求和:递归实现代码报错问题排查

问题描述

我尝试使用递归实现数字各位求和功能。

示例输入/预期输出:

Input: num = 38
Output: 2

说明: 计算过程如下

38 --> 3 + 8 --> 11
11 --> 1 + 1 --> 2 

由于2是个位数,返回该结果。

但运行代码时出现如下错误:

name 'addDigits' is not defined

我的代码如下:

class Solution:
    def addDigits(self, num: int) -> int:
        while num>10:
            num =  sum(int(i) for i in str(num))
            addDigits(self,num)
        
        return num 

请问我的代码存在什么问题?


问题分析与修复

你的代码主要有两个问题:

  1. 递归调用方式错误
    在Python类的成员方法中,调用自身必须通过self.方法名()的形式。你直接写addDigits(self,num),Python会把addDigits当成全局函数,而非类的成员方法,因此会报"name 'addDigits' is not defined"的错误。正确写法是self.addDigits(num)。

  2. 递归与循环混用逻辑矛盾
    你同时使用了while循环和递归,逻辑完全混乱:循环已经在不断更新num的值,递归调用却没有接收返回结果,最终还是依赖循环的num值返回,完全浪费了递归逻辑。

修复方案

你可以选择两种方式修复:

方案一:纯递归实现

去掉while循环,用递归逻辑处理:

class Solution:
    def addDigits(self, num: int) -> int:
        if num < 10:
            return num
        # 计算各位和后递归调用
        return self.addDigits(sum(int(i) for i in str(num)))

方案二:纯循环实现(无需递归)

保留循环,去掉递归调用:

class Solution:
    def addDigits(self, num: int) -> int:
        while num >= 10:
            num = sum(int(i) for i in str(num))
        return num

另外,还有数学优化方案(数字根公式),无需循环或递归直接计算结果:

class Solution:
    def addDigits(self, num: int) -> int:
        if num == 0:
            return 0
        return 9 if num % 9 == 0 else num % 9

这个方法利用数字根性质:一个数的数字根等于它对9取余的结果,当数是9的倍数且不为0时,数字根为9。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 06:30:13