//函数递归//
程序调用自身的编程技巧称为递归 (recursion)
/递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接
调用自身的一种方法/
/它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
递归策略/
/只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
示例1. 使用函数递归实现:
//接受一个无符号整形值,按照顺序打印它的每一位
//输入:1234;输出:1 2 3 4
注://%d 是打印有符号整形(有正负数)
//%u 是打印无符号整形
void print(unsigned int n)
{
if (n > 9)
{
print(n / 10);
}
printf("%d ", n%10);
}
int main()
{
unsigned int num = 0;
scanf_s("%u", &num);
print(num);
return 0;
}
第一次调用print函数: 1234>9
再次调用print函数(传递的参数是(n/10)=123):123>9
第三次调用print函数(传递的是(123 / 10)=12):12>9
第四次调用print函数(传递的是1): 1<9;打印1
然后返回到上一层print(即第三次调用的print),打印12%10 即 2
上一层print(第三层)执行完毕,返回上上一层print(第二层),打印123%10 即 3
最后打印1234%10 即 4
void print(unsigned int n)
{
//if (n > 9)//若将限制条件注释掉,该递归就变成死递归了
//{
print(n / 10);
//}
printf("%d ", n%10);
}
int main()
{
unsigned int num = 0;
scanf_s("%u", &num);
print(num);
return 0;
}
递归必须满足的两个条件:1.递归必须要有停下来的条件,否则就是死递归
2.每次递归调用之后必须越来越接近这个条件
计算机内存:
栈区(Stack)
局部变量
函数的形参
每一次函数的调用都会在栈区申请空间
堆区
静态区
若陷入死递归则会不断递归调用导致栈溢出(Stack overflow)
///
示例2. 使用函数递归实现:
//编写函数不允许创建临时变量,求字符串长度
int my_strlen(char* str)
{
if (*str != '\0')
return 1 + my_strlen(str + 1);//不能写成 str++ ,后置++是先把str本来的值传进去
else
return 0;
}
int main()
{
char arr[] = { "abc" };//{a, b, c, \0}
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
递归:
第一次调用my_strlen函数:my_strlen("abc"); *str = a;
1+my_strlen(str+1)
即 1+my_strlen("bc") --->第二次调用my_strlen函数:my_strlen("bc")
以此类推
/第三次/1+1+my_strlen("c");
/第四次/1+1+1+my_strlen("\0");返回0;
每返回上一层my_strlen返回值+1;最后第一层返回1+1+1+0 即 3。