主要思想摘自《漫谈递归:递归的思想》,同时也是本文的参考资料。
关于递归上面的链接讲的很多,也很详细,开辟这个主题,也是为以后总结一些递归题做准备。目前准备总结一下简单的几个问题:回文,汉诺塔,全排列,整数划分。
之前看递归时,总是很迷,原理都懂,但代码就是理解不了。所以递归很少用,大多数时间都是在用循环,但有些问题,循环是解决不了的,因此,是时候进行总结了。
什么是递归?
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。(来自百科)
在上述的定义中,有一个关键点就是:将一个大型复杂的问题转化为小问题。
递归的基本思想是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。另外这个解决问题的函数必须有明显的结束条件,这样就不会产生无限递归的情况了。