啊我摔倒了..有没有人扶我起来学习....
前言
- 程序调用自身的编程技巧称为递归( recursion)。递归作为一种算法在程序设计语言中广泛应用
- 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问-题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量
- 递归的能力在于用有限的语句来定义对象的无限集合
- 一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回
一、分析问题
- 假如我要打印出
123456
的每一位(先不考虑顺序,能打印就行),那我们按照递归的思想(==大事化小,小事化了——把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解==)分析一下
可以看出来,用10
来对123456
取余,就会得到个位数6
;然后用10
对123456
整除,得到12345
。这就是一个==与原问题相似的规模较小的问题==
二、设计递归代码
- 我们把递归(==递推+回归==)打印每一位封装成一个函数
void recursion_print(int x)
{
if (x > 9)
recursion_print(x / 10);
printf("%d ", x % 10);
}
输出结果:
- 递归不能无限循环下去,于是设计一个判断条件,当
x < 9
时,就已经是一位数了,没必要再递推下去 - 相信刚学的铁汁一开始还是弄不懂为啥这样写,是怎么实现的?别担心,咱们上图解释。
123456
太长了,图要画很大,所以假设我们输入123
所以会先打印出1
,然后是2
,最后是3
,就可以认为这是顺序打印了。
- 假如我想逆序打印呢?我们思考一下。刚刚
123
中,3
最先被取出来却在最后打印,是因为要等最后一个递推结束后才开始执行打印那一行代码,而最后一个递推中,x
是1
,所以先打印出了1
;
那这样的话,我一开始先让3
打印出来不就好啦?我们尝试调整一下代码
void recursion_print(int x)
{
printf("%d ", x % 10);
if (x > 9)
recursion_print(x / 10);
}
输出结果: ==哈哈还真行!!==