目录
前言
前段时间在做题的时候,看见一题字符串逆置的题目,刚开始我寻思着这不挺简单的吗?
我咔咔开始写,后来发现题目要求居然要我用递归求解!!
题目描述:
编写一个函数 reverse_string(char * string)(递归实现)
不能使用C函数库中的字符串操作函数
那时刚学完C语言函数,只是短短认识了几个递归求解的题目。我滴亲娘,该怎么搞呀!而且它只能有一个参数!!
没办法了,当时只能找教程了,现在我就再复刻一下当时的题目,教大家如果用递归逆置字符串!
下面第一个是我当时写的常规解法:
✨常规解法
常规解法就是用left指向第一个下标,用right指向倒数一个下标,将第一个和倒数第一个交换,然后移动左右下标,再将第二个和倒数二个交换......直到 left=right就结束
void reverse_string(char* arr)
{
char *left = arr;
char *right = arr+strlen(arr)-1;
while(left<right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
✨不一样的解法(递归)
学的递归解法:
递归思想就是大事化小:要逆置/abcdef \
可以转变成 先逆置:/bcde\
然后再变成逆置/cd\
.......
例如“abcdef”第一次进去就是首先要求字符串长度,找到最后一个,然后先把它存储起来,再把最后一个位置的元素置成“\0”;再把下一个元素的指针传给这个函数,下一次进去就变成“bcde”,
之后就再重新求字符串长度,再把最后一个字符存储起来,把最后一个位置成“\0”,
继续重复以上步骤直到字符长小于2就停止
然后嘞在调完递归后依次把字符交换即可要注意题目要求是不能用C语言库函数,所以不能使用strlen来求字符串长度,但是我们可以自己模仿实现一个my_strlen求字符串长度
代码实现>
//计算字符串长度
int my_strlen(char* p)
{
int count = 0;
while (*p != '\0')
{
count++;
p++;
}
return count;
}
//逆置字符串
void reverse_string(char* p)
{
int len = my_strlen(p);
char tem = *(p + len - 1);
*(p + len - 1) = '\0';
if (my_strlen(p + 1) >= 2)
{
reverse_string(p + 1);
}
*(p + len - 1) = *p;
*p = tem;
}