简述递归
什么是递归:
程序调用自身的编程技巧称为递归( recursion)。
递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接
调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问
题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程
序的代码量。
递归的主要思考方式在于:把大事化小
必要条件:
1.存在限制条件,当满足这个限制条件的时候,递归便不再继续。
2.每次递归调用之后越来越接近这个限制条件。
下面通过做题,对递归有一个深刻的理解:
**题目1:**接受一个整型值(无符号),按照顺序打印它的每一位。
例如:
输入:1234,输出 1 2 3 4
代码详情:
void nice(int n)
{
if (n > 9)
{
nice(n / 10);
printf("%d ", n % 10);
}
else
{
printf("%d ", n);
}
}
int main()
{
int n = 0;
scanf("%d", &n);
nice(n);
return 0;
}
结果:
思路图解:
**题目2:**递归实现求n的阶乘
代码详情:
int nice(int n)
{
if (n == 0)
{
return 1;
}
else
{
return n * nice(n - 1);
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = nice(n);
printf("%d\n", ret);
return 0;
}
结果:
思路图解:
注意:
当n的值过大时,会出现死递归的现象,这是栈溢出了。
调用函数是会在栈区开辟一个有限的空间,而每次递归时都会在这个空间内再次开辟一个小空间,因为空间是有限的,总有用完的时侯,所以当n值过大时,就会出现死递归。这个时候就可以考虑使用循环了
如下:
int nice(n)
{
int ret = 1;
while (n > 1)
{
ret = ret * n;
n--;
}
return ret;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = nice(n);
printf("%d\n", ret);
return 0;
}
提醒:写代码不是字数越多越好、越难越好,重要的是能够简单快捷的解决我们的问题。
以上是我对递归的认识及理解,小子初学,如有错误还请各位大佬指正。