对于递归有没有什么好的理解方法？
在用递归的时候，就像前面的同学说的那样，当成一个黑盒子，不要老是想着递归这着方法，而是只是把递归函数当成一个普通的调用函数，对这个函数，你需要知道他的输入与输出。 比如最简单的n的阶乘的递归实现，代码如下。 你在写这个函数的时候，把函数定义部分代码蒙起来，主要看这部分代码 那这样看代码，你懂了吗？ 如果你觉得还不懂的话，且听我下面说完。 不说性能上面的影响，递归的使用能让你的代码变得简单清晰，逻辑变得易懂，就比如下面这段代码，用非递归的方式实现阶乘。 这个函数与前面的递归函数求值是一样的，但是在函数逻辑上面差别非常大。 在递归函数里面，运用了一部分的数学逻辑在里面，能清晰看见数学等式，而非递归实现里面数学逻辑其实是隐藏起来的，是编码人员在知道数学逻辑的情况下实现，而没有体现在代码层面上。这样在数学逻辑变动的时候，维护起来是不太好的。 好哒，最后再说一句，如果递归不能让你的代码变得清晰，你自己看代码也会迷惑，那就不要生硬得用递归了。
递归要和迭代比较来看。 迭代是重复反馈过程的活动，其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”，而每一次迭代得到的结果会作为下一次迭代的初始值，因此迭代是从前往后计算的。 递归则是一步一步往前递推，直到递归基础，寻找一条路径， 然后再由前向后计算。 迭代是从前往后计算的，而递归则是先从后往前推，然后再由前往后计算，有“递”又有“归”。 通俗来讲：引自@lishichengyan 一个小朋友坐在第10排，他的作业本被小组长扔到了第1排，小朋友要拿回他的作业本，可以怎么办？ 他可以拍拍第9排小朋友，说“帮我拿第1排的本子”，而第9排的小朋友可以拍拍第8排小朋友，说“帮我拿第1排的本子”...如此下去，消息终于传到了第1排小朋友那里，于是他把本子递给第2排，第2排又递给第3排...终于，本子到手啦！ 这就是递归，拍拍小朋友的背可以类比函数调用，而小朋友们都记得要传消息、送本子，是因为他们有记忆力，这可以类比栈。 更严谨一些，递归蕴含的思想其实是数学归纳法：为了求解问题p（n），首先解决基础情形p（1），然后假定p（n-1）已经解决，在此基础上若p（n）得解，那所有问题均得解。 递归的定义：接受什么参数，返回什么值，代表什么意思 。当函数直接或者间接调⽤⾃⼰时，则发⽣了递归 递归的拆解：每次递归都是为了让问题规模变⼩ 递归的出⼝：必须有⼀个明确的结束条件。因为递归就是有“递”有“归”，所以必须又有一个明确的点，到了这个点，就不用“递下去”，而是开始“归来”。 下面这个求 n! 的例子中，递归出口（确定递归什么时候结束）是fun(1)=1，递归体（确定递归求解时的递归关系）是fun(n)=n*fun(n-1)，n>1。  