【发布时间】:2014-10-29 21:08:29
【问题描述】:
正如标题所解释的那样,我有一个非常基本的编程问题,我还没有解决。过滤掉所有的(非常聪明的)“为了理解递归,你必须先理解递归”。来自各种在线主题的回复我仍然不太明白。
了解当面对不知道我们不知道的事情时,我们可能倾向于提出错误的问题或错误地提出正确的问题我将分享我“认为”我的问题是希望有相似观点的人可以分享一些有助于为我打开递归灯泡的知识!
这是函数(语法是用 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。但我不清楚这个值是如何实现的。
这是我的 2 个挂断:
递归调用该函数,直到满足条件。该条件是 a > b。当满足这个条件时,返回0。乍一看,我认为返回值是0,这显然是不正确的。
在每次迭代中打印出 'a' 的值会产生一个我期望的值:2、3、4、5(此时 5+1 > b 满足第一个条件:a > b ) 但我仍然看不到 14 的值是如何实现的。
我的第一个想法是类似于以下的事情正在神奇地发生:
var answer = a;
answer += a+1 until a > b;
return answer;
所以排除魔法,我只是没有得到任何东西。我很想了解正在发生的事情,而不仅仅是隐含的。
如果有人能解释一下这种函数在技术上会发生什么,为什么结果不是 0 以及最终如何a + sumInts(a: a + 1, b: b) = 14,我将永远欠你的债。
【问题讨论】:
-
递归是那些用数学术语比用代码更容易理解的编程概念之一;有一个很好的定义here
-
LearnYouARecursion,来自世界级教授的完整问题集! -
我只是有敦促您在 Google 搜索框中输入“递归”。其中一个复活节彩蛋。我不会破坏你的惊喜。
标签: function recursion language-agnostic