跟着鹏哥学编程,拿一个好offer。
今天学习函数递归(函数自己调用自己),要注意递归常见错误,就是栈溢出(stack overflow)。因为函数调用占用的内存是在栈区,如果递归一直循环,没有结束条件,就会溢出。
1.输入一个数字,比如1234,输出1 2 3 4,用函数递归实现。
递归函数核心思想是大事化小:(输入1234,输出1 2 3 4)
第一步:将1234分成123 4
第二步:将123分成12 3
第三步:将12分成1 2,
第四步:分解完成,顺序输出1 2 3 4
#include <stdio.h>
void print(int n)//实参num传给n
{
if (n > 9)
{
print(n/10);
}
printf("%d ",n%10);
}
int main()
{
unsigned int num = 0;
scanf("%d",&num);//1234
print(num);
return 0;
}
2.编写函数不允许创建临时变量,求字符串长度。
心中明确递归函数核心思想:大事化小。
例如要求字符串为arr="bit\0",定义函数my_strlen(char* str)求字符串长度,即my_strlen("bit\0")
判断第一个字符不是'\0',则返回1+my_strlen("it");
调用my_strlen(char* str)函数,判断第二个字符不是'\0',则返回1+1+my_strlen("t");直到遇到'\0',终止递归。
#include <stdio.h>
//递归的方法:把大事化小
/*
my_strlen("bit");
1+my_strlen("it");
1+1+my_strlen("t");
1+1+1+my_strlen("\0");
1+1+1+0
=3
*/
int my_strlen(char* str)
{
if (*str != '\0')
{
return (1 + my_strlen(str+1));
}
else
return 0;
}
int main()
{
char arr[] = "bit";
//int len = strlen(arr);//求字符串长度
//printf("%d",len);
//模拟实现了一个strlen函数
int len = my_strlen(arr); //arr是数组,数组传参,传过去的不是整个数组,而是第一个元素的地址
printf("len = %d\n",len);
return 0;
}