必须要培养自己读代码的能力,这很重要!!!!!!!!!!!!
在这里,我想讲一下递归代码得一些注意事项:
1.不能死递归,必须要有跳出条件,每次递归都要逼近跳出条件
2.递归层次不能太深
给当出现STACK OVERFLOW的时候,表示出现了栈溢出,我们知道,内存可以分为栈区,堆区,静态区,其中栈区是存储局部变量和函数的形参的。堆区是存储动态内存分布的一些变量,如malloc/free,calloc等,而静态区是用来存储全局变量和静态变量的,而我们在进行递归的时候,每次调用test()都会在内存的栈区进行空间的分配,当递归层次过多的话就回出现栈溢出。
习题1:编写函数不允许创建临时变量,求字符串的长度。
int my_strlen(char* str)
{
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "bit";
//实现一个strlen函数
printf("%d\n", my_strlen(arr));
return 0;
}
第一种方法,实现一个strlen函数,注意要用指针的方式传入,当*str找到数据不是\0的时候,进入循环即可。
int my_strlen(char* str)
{
if (*str != '\0')
{
return 1 + my_strlen(str + 1);
}
else
{
return 0;
}
}
int main()
{
char arr[] = "bit";
printf("%d\n", my_strlen(arr));
return 0;
}
第二种方法是采用了递归手段,如有不懂可结合下图理解。
习题二://实现一个函数,打印乘法口诀表,口诀表的行数和类书自己指定如输入9,就打印9*9的口诀表
void print(int a)
{
int i = 0;
int ret = 0;
for (i = 1; i <=a; i++)
{
int j = 0;
for (j = 1; j <= i; j++)
{
ret = i * j;
printf("%d*%d=%d ",i,j,ret);
}
printf("\n");
}
}
int main()
{
int a = 0;
printf("请输入数字");
scanf("%d", &a);
print(a);
return 0;
}
习题3:编写一个函数,实现字符串逆序递归,即将参数字符串进行反相排列
int my_strlen(char* str)//算字符长度
{
if (*str != '\0')
{
return 1 + my_strlen(str + 1);
}
else
{
return 0;
}
}
void reverse_string(char* str)
{
int left = 0;
int right = my_strlen(str)-1;
int tmp = 0;
while (left < right)
{
//左边的给右边
tmp = str[left];
str[left] = str[right];
str[right] = tmp;
left++;
right--;
}
}
int main()
{
char arr[] = "abcdef";
reverse_string(arr);
printf("%s\n", arr);
return 0;
}
习题4:写一个递归函数digitsum,输入一个非负整数,返回他的数字之和。如输入123,返回6
int digitsum(int x)
{
int b = 0;
if (x > 9)
{
b = x % 10;
return b + digitsum(x / 10);
}
else
return x % 10;
}
int main()
{
int a = 0;
printf("请输入数字");
scanf("%d", &a);
int ret = digitsum(a);
printf("%d\n", ret);
return 0;
}
习题5:/实现n的k次方,用递归实现
int pow(int x, int y)
{
if (y != 0)
{
return x * pow(x, y - 1);
}
else if (y == 0)
{
return 1;
}
else
{
return 1.0 / pow(x,-y);
}
}
int main()
{
int n = 0;
int k = 0;
printf("输入数字");
scanf("%d %d", &n, &k);
double ret = pow(n, k);
printf("%lf\n", ret);
return 0;
}