题目大意是这样的:给定一个字符串使用递归的方法将字符串逆序,注意是不是逆序打印,并不使用string.h的库函数
思路:字符串逆序首先要知道字符串数组的长度,又不能调用库函数,顾需要自己写一个能实现strlen的函数,使逆序函数调用,所以需要两个函数:
1. 能求出字符串数组长度的数组
2. 实现字符串逆序的函数(调用第一个函数来得到数组长度)
实现第一个函数:
这个函数其实很简单可以用递归来实现也可以用循环来实现我这里就直接放出源码了
递归实现:
int my_strlen(char *p)
{
int n = 0;
if (*p != '\0')
{
return 1+my_strlen(p + 1);
}
else
{
return 0;
}
}
循环实现
int my_strlen(char* p)
{
int n = 0;
while (*p != '\0')
{
n += 1;
p++;
}
return n;
}
实现第二个函数:
假设我们要使字符串“abcdefg”逆序,逆序实际上是交换首尾的字符,顾设第一个字符和最后一个字符分别序号为 left =0 和 right=my_strlen§-1 ,将最右边的字符即p[right]与p[left]交换,然后递归fun(p+1),但是如果这样做,我们会发现左边边的指针移向了下一位,但是右边的还停留在上一个,而如果要使做右边指针移动必须知道递归次数,这样非常不方便,如图
void reverse(char* p)
{
int left = 0;
int right = my_strlen(p)-1;
char temp;
temp = p[left];
p[left] = p[right];
p[right] = temp;
reverse(p+1);
}
如果右边指针能随着递归次数增加而自己往左边移动这个问题就迎刃而解了,这时就有一个巧妙的方法:
我们将p[left]的值存入temp, 并将p[right]赋值给p[left], 然后令p[right]=’\0’
void reverse(char* p)
{
int left = 0;
int right = my_strlen(p)-1;
char temp;
temp = p[left];
p[left] = p[right];
p[right] = '\0';
reverse(p + 1);
p[right] = temp;
}
这样p+1进入下一次递归时,由于my_strlen()函数只能返回’\0’前字符的个数, 使p[right]指针往左移了一位效果如图
这是进行了多次递归,如果没有对递归进行限制函数会进入死循环,顾要满足一定条件才能进入reverse(p+1),而这个条件很明显是my-strlen§>1,如果字符串长度小于一就没有交换的必要了。
void reverse(char* p)
{
int left = 0;
int right = my_strlen(p)-1;
char temp;
temp = p[left];
p[left] = p[right];
p[right] = '\0';
if (right>0)
{
reverse(p + 1);
}
p[right] = temp;
}
最终递归的流程如图:
最终代码:
#include<stdio.h> //递归使字符串逆序
int my_strlen(char *p)
{
int n = 0;
if (*p != '\0')
{
return 1+my_strlen(p + 1);
}
else
{
return 0;
}
}
void reverse(char* p)
{
int left = 0;
int right = my_strlen(p)-1;
char temp;
temp = p[left];
p[left] = p[right];
p[right] = '\0';
if (right>0)
{
reverse(p + 1);
}
p[right] = temp;
}
int main()
{
char arr[] = "abcdefg";
reverse(arr);
printf("%s", arr);
return 0;
}
有错误欢迎大家指正,谢谢