一.先来看一个最简单的递归
#include<stdio.h>
int main()
{
printf("hehe");
main();
return 0;
}
输出:
hehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehehe
printf("hehe");
^
main.c:4:10 Function Stack Over Flow. (Max Func Call Deep = 1024)
以上的错误名为:栈溢出
错误原理:
将内存空间分为几个区域:
栈区:用于创建局部变量,函数形式参数
堆区:用于动态开辟的内存(such as :malloc , calloc)
静态区:用于存放全局变量(static修饰的变量)
main()不断调用自己,函数的调用需要申请栈空间,而当栈空间被堆满的时候,发生错误,即栈溢出。
stackoverflow.com:程序猿的知乎网站
二.递归练习题
计算字符串的长度。
不用递归的写法:
#include<stdio.h>
int my_strlen(char* str)
{
int count = 0;
while(*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "heheheheehhee";
int len = my_strlen(arr);
//arr是数组,数组传参,传过去的不是整个数组,而是第一个元素的地址
printf("len = %d\n",len);
}
递归的写法:
#include<stdio.h>
int my_strlen(char* str)
{
if(*str == '\0')
{
return 0;
}
else
{
str++;
return 1 + my_strlen(str);
}
}
int main()
{
char str[] = "sklfnnfklsabfkebf";
int len = my_strlen(str);
printf("len = %d\n",len);
return 0;
}