在应用程序中为什么要使用递归?何时使用递归?如何用? “写任何一个程序可以用赋值和if-then-else语句表示出来,而while语句则可以用赋值、if-then-else和递归表示出来。”(出自Ellis Horowitz的《数据结构基础(C语言版)》 - Fundamentals of Data Structure in C) 递归解决方案对于复杂的开发来说很方便,而且十分强大,但由于频繁使用调用栈(call stack)可能会引起性能问题(有些时候性能极差)。 我们来看一看下面这个图:
调用栈图示 下面我打算介绍一些例子来帮助你更好的理解递归的风险和回报。 1. 阶乘 阶乘(!)是小于某个数的所有正整数的乘积。 0! = 1 1! = 1 2! = 2 * 1! = 2 3! = 3 * 2! = 6 ... n! = n * (n - 1)! 下面是计算阶乘的一种实现方法(没有递归): 代码如下: public long Factorial(int n) { if (n == 0) return 1; long value = 1; for (int i = n; i > 0; i--) { value *= i; } return value; }
下面是用递归的方法实现计算阶乘,与之前的代码比起来它更简洁。 代码如下: public long Factorial(int n) { if (n == 0)//限制条件,对该方法调用自己做了限制 return 1; return n * Factorial(n - 1); }