Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算数字和的递归函数_Python - Fatal编程技术网

Python 计算数字和的递归函数

Python 计算数字和的递归函数,python,Python,我必须编写一个递归函数来计算一个数字的和,下面是我尝试的代码: def sum_digit(n): sum=0 a = n % 10 n //= 10 sum += a while n > 0 : sum = sum + sum_digit(n) return sum print(sum_digit(67154)) 我不知道为什么我没有得到23作为答案…我的计划没有结束 例如23个数字(如果我错了,请纠正我,我是python新手),3去

我必须编写一个递归函数来计算一个数字的和,下面是我尝试的代码:

def sum_digit(n):
   sum=0
   a = n % 10
   n //= 10
   sum += a
   while n > 0 :
      sum = sum + sum_digit(n)
   return sum


print(sum_digit(67154))
我不知道为什么我没有得到23作为答案…我的计划没有结束

例如23个数字(如果我错了,请纠正我,我是python新手),3去求和,n变成2,因为它>0,那么它应该去while,所以现在它应该计算和数字(2),a变成2,2去求和,n变成0,和数字(2)返回2,然后它和3求和,我必须得到5。
非常感谢您的帮助。

我必须用if更改while,它很有效,谢谢您的评论,也很抱歉在这里发布这样的问题。

您有一个无限循环,因为
n
在循环中从不更改。请注意,在被调用函数的作用域中将新值赋值给
n
,不会改变外部作用域中的
n

此外,您似乎正在混合迭代解决方案和递归解决方案。如果执行递归调用,则不需要循环,反之亦然

您可以递归地执行以下操作:

def sum_digit(n):
    if n > 0:
        return sum_digit(n // 10) + n % 10
    else:
        return 0
或者以迭代的方式:

def sum_digit(n):
    s = 0
    while n > 0:
        s += n % 10
        n //= 10
    return s
或者只是使用bultin函数(可能不是您的老师希望看到的):


这将实现以下目的:

def sum_digit(n, current_sum=0):
    if n == 0:
        return current_sum
    else:
        digit = n % 10
        current_sum += digit
        n //= 10
        return sum_digit(n, current_sum)
输出:

print(sum_digit(67154))
> 23
您混合了迭代方法(while循环)和递归方法(函数调用)

在递归函数中,必须确保正确执行以下操作:

结束条件(在本例中,当数字为0时,我们返回总和)

递归调用(在我们的例子中,每次下降一位)


按以下方式更改代码:

def sum_digit(n):
   sum=0
   a = n % 10
   n //= 10
   sum += a
   if n > 0 :
      sum = sum + sum_digit(n)
   return sum

原因是n在函数内部被分配了新的引用,但在函数外部它是不可见的。所以,当部分是循环死亡。事实上,虽然part最多执行一次,但代码还是如上所述进行了更改。

而n>0
在循环中您永远不会更改
n
。似乎您在这里混合了迭代和递归解决方案。尽管您将
n
更改为
n/=10
,但这只会影响该函数中的
n
。您需要了解作用域和递归如何工作才能理解这一点,但基本上修改
n
不会影响调用
sum\u digit
的函数;博士将
while
更改为
if
,不要将
sum
用作变量,因为它会屏蔽内置函数。
def sum_digit(n):
   sum=0
   a = n % 10
   n //= 10
   sum += a
   if n > 0 :
      sum = sum + sum_digit(n)
   return sum