简单来说,递归(recursion)就是程序简单调用自身的技巧。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
调用自身的方法为递归方法(recursive method)。这个调用就称为递归调用(recursive call 或 recursive invocation)。
设计成功递归的准则:
1.方法必须被赋予一个输入值,通常以实参的形式,有时候也以读入值的形式;
2.方法的定义必须包括这样的逻辑,方法必须以这个输入值作为导致不同情况的参数。这样的逻辑一般包括一个if语句或switch语句。
3.其中一个或多个情况应该具有无需递归的解,这些情况为基本情况或终止情况(stopping cases);
4.其中一个或多个情况必须包含对方法的递归调用。这些递归调用在某种意义上应该通过使用“更小”的实参或者解决该方法所要执行的任务的“更小”版本,向某个基本情况前进一步
/**Task:从一个给定的正整数开始倒计数
* @param integer 大于0的整数*/
public static void countDown(int integer){
System.out.println(ingeger);
if(integer>1)
countDown(integer-1);
}
活动记录栈:对一个方法的每次调用都会产生一个活动记录放进栈里,该记录保存了方法的执行状态。通常,递归方法要比迭代方法用到更多的内存,因为每一次递归调用都会产生一个活动记录。