若是初次接触递归,难免会觉得这个东西会有些变态,其实他也没那么难,不要给自己思维定势了
#递归 递归,实际上就是一个递,一个归的过程!
这里首先要注意递归存在两个注意事项:
#存在限制条件,当满足这个限制条件的时候,递归便不再继续。
#每次递归调用之后越来越接近这个限制条件。
接下来看例子:
例:
输入:1234,输出: 1 2 3 4.
看到这个问题,我们可能最直接想到一个办法就是通过将1234这个数先 %10 ,得到“4”,再 /10
得到123,再 %10,得到“3”,再 /10,得到12 ...以此类推,我们可以得到这样一个序列4321,我还需要将此序列进行倒序打印或是先排序再打印等等办法,但这势必也会增大代码量,所以此时如果用递归,问题就可以很好的解决。
怎么用递归呢?
通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解, 递归策略。
#核心思想就是:大事化小
这个例子就可以想象成:把这个问题拆分一下,把要打印 {print(1234)}转化成 {print(123) 4},
又可以被拆分成{print(12) 3 4},继续拆分{print(1) 2 3 4 },最后 1 2 3 4 ,这样就是上文所说的核心.
咱先上代码 !
#include <stdio.h>
void print(int n)
{
if (n > 9)
{
print(n / 10);
}
printf("%d ", n % 10);
}
int main()
{
int num = 1234;
print(num);
return 0;
}
在print的函数里,if(n>9)就是限制条件,n%10就是每次递归调用之后越来越接近这个限制条件。
倘若失去了限制条件,可能就会有递无归啦
这里我们画图分析以下代码
第一次调用函数,满足if(n>9)条件,递到第二个print函数,此时,大事化小,n=123,123满足条件,进入第三个print函数
进入第三个print函数时n=12满足条件,进入第四个print函数
此时,n=1不满足条件,开始递归中“归”的过程:进入到printf("%d",n%10);中,打印 1(空格) ,然后退出第四个print函数,回到第三个print打印 3
以此类推:
打印 2
最后
打印1
就是这样一个流程
最后提醒一点,一定要注意递归的限制条件!