1,什么是递归
程序调用自身的编程技巧称为递归(recursion).
递归作为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需要少量的程序就可以描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
递归的主要思考方式:大事化小(这个思维很关键,需要自己慢慢去培养,理解)
2,实战讲解
好了,接下来我会通过例子在详细介绍递归函数,上例子
我这里就出一个比较简单的例子,方便大家理解:递归实现求n的阶乘(不考虑溢出的问题)
首先,我先说一下阶乘,比如求5的阶乘,那么就是从5一直乘到一,也就是5!,那么如何用递归来表示呢?前面我提到了很重要的一点,大事化小,那么咱们来看5!,本质上是不是5个数相乘呢?那可不可看成是两个数相乘来做到大事化小呢?当然可以,5!=5*4!,这就是递归思路,那么,废话不多说,上代码。
3,代码演示
这里为了方便大家理解,我先说一下阶乘的定义:
阶乘n!的定义(n为非负整数)
1, 0!=1;2,若n>0,则n=n * (n-1)
只要形参n中接收的值大于1,函数factorial就会返回n * factorial(n-1)的值,否则就会返回1。这串代码虽然看上去简单,但是执行时的行为却很复杂,我们来详细讲一下。
4,讲解
下面我们以“求3的阶乘”为例,来看一看函数factorial是如何求阶乘的,这里每个阶段我就用不同颜色来方便大家理解和区分。
1,通过factorial(3)调用函数factorial。因为形参n会被传入3,所以该函数返回3*factorial(2);这里注意:想要计算结果就要必须先要知道factorial(2)的值,所以以2为参数再次调用函数factorial。
2,这时,被调用的factorial函数,会将2传入形参n中,所以函数返回了2*factorial(1),同上,只要n不为0,就一直计算,一直逼近0。
3,这时,被调用的factorial函数,会将1传入形参n中,所以函数返回了1*factorial(0)。
4,因为形参n中接收的值为0,所以函数factorial返回1。
大家可以看图去理解:
3,收到返回值1的函数factorial,返回1*factorial(0),即1 * 1.
2,收到返回值1的函数factorial,返回2*factorial (1) ,即2 * 1.
1,收到返回值2的函数factorial,返回3*factorial(2),即3 * 2.
大家看到这里是不是对递归函数有了一定的认知呢,其实明白了其中的原理,是不难的,在这里我给大家总结一下递归的两个必要条件:
1,存在限制条件,当满足这个限制条件的时候,递归便不再继续下去。
2,每次递归调用之后会越来越接近这个限制条件。
其实这个啊,限制条件是非常重要的,如果你不设限制条件或者限制条件错误的话,就会死递归,这跟死循环很像,但又不完全相同。
好了,今天我就分享到这里了,大家记得给个一键三连哦,最后祝大家五一快乐!!!