正如标题所解释的那样,我有一个非常基本的编程问题,只是我还不能摸索。过滤掉所有(非常聪明的)“为了理解递归,你必须首先理解递归。”来自不同的在线线程的答复我仍然不太明白。
了解到当我们面对不知道我们不知道的事情时,我们可能会问错问题或者问错了正确的问题--我会分享我的“想法”我的问题是希望有类似观点的人能够分享一些知识,这将有助于我打开递归灯泡!
下面是函数(语法用SWIFT编写):
func sumInts(a: Int, b: Int) -> Int {
if (a > b) {
return 0
} else {
return a + sumInts(a: a + 1, b: b)
}
}
我们将使用2和5作为我们的论点:
println(sumInts(a: 2, b: 5))
显然答案是14。但我不清楚这种价值是如何实现的。
这是我的两只大杂烩:
我的第一个想法是,类似的事情正在神奇地发生:
var answer = a;
answer += a+1 until a > b;
return answer;
所以排除魔法,我只是没有得到一些东西。我很想知道发生了什么,而不仅仅是含蓄的。
如果有人能很好地解释这种函数在技术上发生了什么,为什么结果不是0,以及最终结果是怎样的,a + sumInts(a: a + 1, b: b) = 14
我会永远欠你的。
发布于 2018-04-02 07:45:25
我思考这种混淆是因为人们把它看作是“同一功能”被多次调用的结果。如果您认为它是“被调用的同一个函数的许多副本”,那么它可能会更清楚:
函数的一个副本只返回0,而且它不是第一个(这是最后一个)。所以调用第一个的结果不是0。
至于第二点混乱,我认为用英语拼写递归会更容易一些。读这一行:
return a + sumInts(a + 1, b: b)
作为“返回‘a’+的值(函数的另一个副本的返回值,即‘a’+的副本值(函数的另一个副本的返回值,它是‘a’+(...)的第二个副本的值”),函数的每一个副本都会产生一个自身的新副本,a增加1,直到满足a>b条件为止。
当到达a>b条件为true时,有一个(可能任意)长的函数副本堆栈,所有这些副本都在运行的中间,所有这些副本都在等待下一个副本的结果,以找出它们应该添加到‘a’中的内容。
发布于 2018-04-02 09:02:35
1.函数被递归调用,直到满足条件。那个条件是
a > b
...。当满足此条件时,返回0。乍一看,我希望返回值为0,这显然是不正确的。
以下是计算机计算sumInts(2,5)
如果它能够:
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
和递归调用返回的值。
https://stackoverflow.com/questions/-100004335
复制相似问题