无法理解此递归函数
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 感到困惑。它本质上是函数中的函数。我一开始没听懂,这就是我感到困惑的原因。 是的,这正是递归——如果你必须非常小心其中一个分支返回一些东西,否则你可以获得无限递归(不是真的无限,它最终会崩溃)以上是关于无法理解此递归函数的主要内容,如果未能解决你的问题,请参考以下文章