题目
编写一个函数 reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列,不是逆序打印。
要求:不能使用C函数库中的字符串操作函数。
比如:
char arr[] = “abcdef”;
逆序之后数组的内容变成:fedcba
答案
#include<string.h>
//循环
void reverse_string1(char* string)
{
int left = 0;//a的下标
int right = strlen(string) - 1;//f的下标
while (left <= right)
{
char tap = *(string + left);
*(string + left) = *(string + right);
*(string + right) = tap;
left++;
right--;
}
*(string + strlen(string)) = '\0';
}
//递归
void reverse_string2(char* string)
{
// a-f b-e c-d 0-0
int len = strlen(string) - 1;//最后的下标 5 3 1 0
char tap = *string;//中间容器 a b c 0
if (*string != '\0')//a b c 0
{
*string = *(string + len);// f e d
*(string + len) = '\0';// 0 0 0
reverse_string2(string + 1);// b c 0
// c-d b-e a-f
*(string + len) = tap;// c b a
}
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abcdef";
reverse_string1(arr1);
reverse_string2(arr2);
printf("循环:arr1=%s\n", arr1);
printf("递归:arr2=%s\n", arr2);
return 0;
}
解答
1.先锁定主函数中的大体
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abcdef";//递归
reverse_string1(arr1);
reverse_string2(arr2);//递归
printf("循环:arr1=%s\n", arr1);
printf("递归:arr2=%s\n", arr2);//递归
return 0;
}
- 定义字符串
- 调用函数
- 打印逆序字符串
2. 先使用循环解答法,简单解答,清晰思路
void reverse_string1(char* string)
{
int left = 0;//a的下标
int right = strlen(string) - 1;//f的下标
while (left <= right)
{
char tap = *(string + left);
*(string + left) = *(string + right);
*(string + right) = tap;
left++;
right--;
}
*(string + strlen(string)) = '\0';
}
- 用类似二分查找法,将第一个字母(左边)的下标标为0,最后一个字母(右边)下标标为字符串长度-1
- 当左边字母大于右边时,即交换完成
- 交换完成后,加入结束字符‘\0’
3. 递归
void reverse_string2(char* string)
{
// a-f b-e c-d 0-0
int len = strlen(string) - 1;//最后的下标 5 3 1 0
char tap = *string;//中间容器 a b c 0
if (*string != '\0')//a b c 0
{
*string = *(string + len);// f e d
*(string + len) = '\0';// 0 0 0
reverse_string2(string + 1);// b c 0
// c-d b-e a-f
*(string + len) = tap;// c b a
}
}
- 先找出最后字母的下标(strlen函数)len = strlen(string) - 1,在设置一个中间容器可以过渡从第一个字母变为最后一个字母,先将调入数组中的字符存放在中间容器tap中
- 当字母数组的字符不为‘\0’时进入条件,将字符等于最后一个字符。将最后一个字符变为‘\0’,再次进行调用reverse_string2()函数并将数组地址+1(也就是下标的下一位)
次数 | len范围 | 下标 | 字母 | *string字母 | tap |
---|---|---|---|---|---|
第一轮 | a-f | 5 | a | f | a |
第二轮 | b-e | 3 | b | e | b |
第三轮 | c-d | 1 | c | d | c |
第四轮 | 0-0 | 0 | 0 | 未进入条件语句 | 0 |
此时跳出第四轮,进入第三轮执行调用下一条语句。
将中间容器tap中的字母放入地址string+len中,从第三轮倒着往回放。
递归结束。