递归的核心思想就是用于自身问题相似但规模较小的问题来描述自己。
其实递归就是:
从前有座山,山里有座庙,庙里有个老和尚,老和尚在讲故事,讲什么呢?讲:从前有座山,山 里有座庙,庙里有个老和尚,老和尚在讲故事,讲什么呢?讲:从前有座山,山里有座庙,庙里有个老和尚, 老和尚在讲故事,讲什么呢?讲:…………。好家伙,这样讲到世界末日还讲不玩,老和尚讲的故事实际上就是前面的故事情节,这样不断地调用程序本身,就形成了递归。 万一这个故事中的某一个老和尚看这个故事不顺眼,就把他要讲的故事换成:“你有完没完啊!”,这样,整个故事也就嘎然而止了。
递归的特征:
1. 都有递归终止的边界条件是。
2. 除了边界条件,其它各处的定义需要用到和自身问题相似但规模较小的问题。
几个例子:
组合问题 :
在n个数中选取m(0<m<=n)个数,将所有组合按字典顺序输出。
下面是递归实现的代码:
排列问题 :
在n个数中选取m(0<m<=n)个数,将所有排列合按字典顺序输出。
只需在组合的基础上略微修改就成了排列的解决办法了。
对于组合,因为不能出现相同的数,所以每次都是从+1的位置开始,
而排列是允许出现相同的数,所以每次只需从0位置开始即可,
同时为了避免单个数字重复出现,需要一个数组,记录哪些数字是已经出现过的。
下面是递归实现的代码:
自然数分解问题:
给定自然数n,将其拆分成若干自然数的和。输出所有解,每组解中数字按从小到大排列。相同数字的不同排列算一组解。
下面是实现的代码: