目录
前言
本次对递归的实现进行更近一步的学习与使用。本次使用的递归对象为
char arr[] = "abcdef";
思路
迭代法
初步使用函数的方法以实现该功能,通过把字符数组传进函数中完成该目标,不用返回。所以设置void reverse_string(),返回值类型为空。
为了在数组实现字符串倒序,于是设置左右指针对数组进行操作,使首尾依次交换位置。
arr为数组首地址,所以进行加数操作可以使数组下标指向数组上的其他位置。
void reverse_string(char* arr)
{
char* left = arr;//设置左指针
char* right = arr + strlen(arr) - 1;//设置右指针
while (left < right)
{
char temp = *left;
*left = *right;
*right = temp;
left++;
right--;
}
}
代码一
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
void reverse_string(char* arr)
{
//设置左指针
char* left = arr;
//设置右指针
char* right = arr + strlen(arr) - 1;
while (left < right)
{
//交换指针所指的字符
char temp = *left;
*left = *right;
*right = temp;
//指针移到下一位
left++;
right--;
}
}
int main()
{
char arr[] = "abcdef";
reverse_string(arr);
printf("%s", arr);
return 0;
}
递归法
通过以上的方法总结出,要使函数实现字符串逆序的功能的需要实现当前字符数组的首尾交换。
可以初步得到以下代码:
void reverse_str(char* arr)
{
//计算字符数组的长度
int len = strlen(arr);
//实现首尾交换
char tem = *arr;
*arr = *(arr + len - 1);
*(arr + len - 1) = tem;
}
每交换一次首尾两数,就需要将位置进行改变,因为初始设置判断末尾字符为*(arr + len - 1),所以当前递归中在*(arr + len - 1)赋值给*arr后需要手动将其归零。并且开始下一次递归。
void reverse_str(char* arr)
{
int len = strlen(arr);
char tem = *arr;
*arr = *(arr + len - 1);
//使数组最后一个为\0,即缩小字符数组的范围
*(arr + len - 1) = '\0';
//判断是否为最后一个字符,如果不是则继续递归
if (strlen(arr + 1) >= 2)
reverse_str(arr + 1);
*(arr + len - 1) = tem;
}
代码二
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
void reverse_str(char* arr)
{
//计算字符数组的长度
int len = strlen(arr);
//实现首尾交换
char tem = *arr;
*arr = *(arr + len - 1);
//使数组最后一个为\0,即缩小字符数组的范围
*(arr + len - 1) = '\0';
//判断是否为最后一个字符,如果不是则继续递归
if (strlen(arr + 1) >= 2)
reverse_str(arr + 1);
//实现首尾交换
*(arr + len - 1) = tem;
}
int main()
{
char arr[] = "abcdef";
reverse_str(arr);
printf("%s", arr);
return 0;
}
其他
既然提到了一个函数和数组的使用,可以有一个提高的进阶使用——传入多个数据。
void reverse_st(char arr[],int left,int right)
{
}
代码三
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
void reverse_st(char arr[],int left,int right)
{
char temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
if (left < right - 1)
reverse_st(arr, left + 1, right - 1);
}
int main()
{
char arr[] = "abcdef";
int left = 0;
int right = strlen(arr) - 1;
reverse_st(arr,left,right);
printf("%s", arr);
return 0;
}
总结
对使用递归方法更近一步的同时也充分考验了对数组和指针的运用。
在其他的方法当中,有一点非常值得注意,就是在进行递归前进行的判断 if (left < right - 1) 。 因为选用的数据长度为6个字母,所以在进行递归时会出现一个错误(错误代码以及错误结果如下图所示)。只要在 if (left < right) 中的 right 减去1就可以解决该相关问题。