无法理解此递归函数

Posted

技术标签:

【中文标题】无法理解此递归函数【英文标题】:Having trouble understanding this recursion function 【发布时间】:2019-11-06 03:47:13 【问题描述】:

我在一个教程网站上查看递归的主题,遇到了以下问题和解决方案:

问题:

给定一个整数,创建一个函数,该函数返回该整数中所有单个数字的总和。例如:如果 n = 4321,则返回 10,因为 4+3+2+1=10。

解决方案:

def sum_func(n):
    if n<10:
        return n
    else:
        return n%10 + sum_func(int(n/10))
    pass

我知道“如果 n

有人可以帮我理解“n%10 + sum_func(int(n/10))”的作用吗?如果你能一次走一遍逻辑,那将不胜感激!

【问题讨论】:

int(n/10) 是 23,但您没有添加它。相反,您添加的是sum_func(int(n/10)),即5 (2+3)。 n%10 按此顺序给出最后一个整数 1, 2 3 4。所以试着得到你需要用int(n/10)分割n的数字,这给出了432, 43, 4,所以你得到了1+2+3+4=10 【参考方案1】:

如果n = 235 那么int(n/10) 就是23。但是,您添加了 5 和 23。您添加了 sum_func(int(n/10))5

sum_func(int(n/10)) 不是int(n/10)

sum_func(int(n/10)) 将数字“23”中的数字相加。

因此,sum_func(int(n/10)) == 2 + 3 == 5

sum_func(235) == sum_func(235)
              == sum_func(23)    + 5
              == sum_func(2) + 3 + 5
              == 2           + 3 + 5

【讨论】:

谢谢,塞缪尔。你的回答很有帮助。一开始我很粗心,错过了“函数中的函数”,以为我只是将5和23加在一起。但现在一切都说得通了:)【参考方案2】:

如你所说,如果只有 1 位,请返回。

% 是 modulus 运算符 - 即除以 10 时的余数,或者只是最后一位(即 235%10 = 5)

int(n/10) 删除自 int() 函数向下舍入后的最后一个数字 - 即 235 -> 23

现在您似乎感到困惑的是在sum_func 内,它会再次调用sum_func,一旦最后一个数字被删除,即 23(这是递归部分),它将返回 5。

即你有

sum_func(235)
=5 + sum_func(23)
=5 + (3 + sum_func(2))
=5 + (3 + (2))
=10

【讨论】:

谢谢!我确实对 sum_func 中的 sum_func 感到困惑。它本质上是函数中的函数。我一开始没听懂,这就是我感到困惑的原因。 是的,这正是递归——如果你必须非常小心其中一个分支返回一些东西,否则你可以获得无限递归(不是真的无限,它最终会崩溃)

以上是关于无法理解此递归函数的主要内容,如果未能解决你的问题,请参考以下文章

javascript --- 递归的简单理解

关于python递归函数怎样理解

递归就是在过程或函数里调用自身 这句话怎么理解?举个例子

为啥我们需要在这个递归函数中返回

关于回调和递归思想的理解

python 数据结构 理解迭代与递归 递归的实例 栈帧 函数调用