首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >了解递归函数如何工作?

了解递归函数如何工作?
EN

Stack Overflow用户
提问于 2018-04-01 23:43:32
回答 2查看 0关注 0票数 0

正如标题所解释的那样,我有一个非常基本的编程问题,只是我还不能摸索。过滤掉所有(非常聪明的)“为了理解递归,你必须首先理解递归。”来自不同的在线线程的答复我仍然不太明白。

了解到当我们面对不知道我们不知道的事情时,我们可能会问错问题或者问错了正确的问题--我会分享我的“想法”我的问题是希望有类似观点的人能够分享一些知识,这将有助于我打开递归灯泡!

下面是函数(语法用SWIFT编写):

代码语言:txt
复制
func sumInts(a: Int, b: Int) -> Int {
    if (a > b) {
        return 0
    } else {
        return a + sumInts(a: a + 1, b: b)
    }
}

我们将使用2和5作为我们的论点:

代码语言:txt
复制
println(sumInts(a: 2, b: 5))

显然答案是14。但我不清楚这种价值是如何实现的。

这是我的两只大杂烩:

  1. 函数被递归调用,直到满足条件为止。这个条件是a>b。当满足此条件时,返回0。乍一看,我希望返回值为0,这显然是不正确的。
  2. 在每次迭代中打印出‘a’值将产生一个我所期望的值:2、3、4、5(在这里,5+1>b满足第一个条件:a>b),但我仍然不知道如何实现14的值。

我的第一个想法是,类似的事情正在神奇地发生:

代码语言:txt
复制
var answer = a;
answer += a+1 until a > b;
return answer;   

所以排除魔法,我只是没有得到一些东西。我很想知道发生了什么,而不仅仅是含蓄的。

如果有人能很好地解释这种函数在技术上发生了什么,为什么结果不是0,以及最终结果是怎样的,a + sumInts(a: a + 1, b: b) = 14我会永远欠你的。

EN

回答 2

Stack Overflow用户

发布于 2018-04-02 07:45:25

思考这种混淆是因为人们把它看作是“同一功能”被多次调用的结果。如果您认为它是“被调用的同一个函数的许多副本”,那么它可能会更清楚:

函数的一个副本只返回0,而且它不是第一个(这是最后一个)。所以调用第一个的结果不是0。

至于第二点混乱,我认为用英语拼写递归会更容易一些。读这一行:

代码语言:txt
复制
return a + sumInts(a + 1, b: b)

作为“返回‘a’+的值(函数的另一个副本的返回值,即‘a’+的副本值(函数的另一个副本的返回值,它是‘a’+(...)的第二个副本的值”),函数的每一个副本都会产生一个自身的新副本,a增加1,直到满足a>b条件为止。

当到达a>b条件为true时,有一个(可能任意)长的函数副本堆栈,所有这些副本都在运行的中间,所有这些副本都在等待下一个副本的结果,以找出它们应该添加到‘a’中的内容。

票数 0
EN

Stack Overflow用户

发布于 2018-04-02 09:02:35

1.函数被递归调用,直到满足条件。那个条件是a > b...。当满足此条件时,返回0。乍一看,我希望返回值为0,这显然是不正确的。

以下是计算机计算sumInts(2,5)如果它能够:

代码语言:txt
复制
I want to compute sumInts(2, 5)
for this, I need to compute sumInts(3, 5)
and add 2 to the result.
  I want to compute sumInts(3, 5)
  for this, I need to compute sumInts(4, 5)
  and add 3 to the result.
    I want to compute sumInts(4, 5)
    for this, I need to compute sumInts(5, 5)
    and add 4 to the result.
      I want to compute sumInts(5, 5)
      for this, I need to compute sumInts(6, 5)
      and add 5 to the result.
        I want to compute sumInts(6, 5)
        since 6 > 5, this is zero.
      The computation yielded 0, therefore I shall return 5 = 5 + 0.
    The computation yielded 5, therefore I shall return 9 = 4 + 5.
  The computation yielded 9, therefore I shall return 12 = 3 + 9.
The computation yielded 12, therefore I shall return 14 = 2 + 12.

如你所见,对函数的调用sumInts实际上返回0,但这不是最后的值,因为计算机仍然必须将5加到0,然后再将4加到结果,然后3,然后2,正如我们计算机的最后四句话所描述的。注意,在递归中,计算机不仅需要计算递归调用,还必须记住如何处理递归调用返回的值。计算机内存中有一个特殊的区域叫做堆栈在保存此类信息的地方,这个空间是有限的,太递归的函数可以耗尽堆栈:这是堆栈溢出给我们最爱的网站命名。

你的陈述似乎是隐含的假设,即计算机在执行递归调用时忘记了它所处的位置,但它没有,这就是为什么你的结论与你的观察结果不一致的原因。

2.在每次迭代中输出‘a’的值将产生一个我所期望的值:2、3、4、5(在这里,5+1>b满足第一个条件:a>b),但我仍然不知道如何实现14的值。

这是因为返回值不是a的价值之和a和递归调用返回的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100004335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档