前言
本篇文章叙述利用递归解决问题的例子。
一、题目:递归实现字符串逆序
1.1 解法一
使用递归将一个字符串逆序
函数名:reverse(char* string)
要求:不能使用库函数
1.1.1 解题思路
假设字符串为:abcd\0
第一步:将字符串的第一个字符保存到临时变量中
第二步:将字符串的最后一个字符放到string指向的位置
第三步:用\0字符替代当前字符串的最后一个字符
第四步:判断字符串的长度是否小于2,以此判断是否进行递归
第五步:将tmp的值放在当前字符串的最后一个位置。
下面是流程分析图。如图1.1所示:
思考:
- 为什么要将\0放在当前字符串的最后一个位置?
为了便于下一次递归的字符串正确计算出长度,以便第一个和最后一个字符的交换。
1.1.2 程序设计及实现
程序的N-S图如图1.2所示:
代码实现如下:
//求一个字符串的长度
int my_strlen(char* string)
{
int count = 0;
while (*string != '\0')
{
count++;
string++;
}
return count;
}
//只有一个参数
void reverse(char* string)
{
int len = my_strlen(string);
char tmp = *string; //保存第一个元素
*string = *(string + (len-1)); //将字符串的最后一个位置的值移动到第一个位置
*(string + (len - 1)) = '\0';
if (my_strlen(string+1) >= 2)
reverse(string+1);
*(string + (len - 1)) = tmp;
}
1.2 解法二
使用递归将一个字符串逆序
函数名:reverse(char string,int left,int right)
要求:不能使用库函数
1.2.1 解题思路
假设字符串为abcd\0
第一步,判断left是否小于right,以此判断是否进行交换并进行递归
第二步,将下标为left的字符放在临时变量tmp中
第三 步,将下标为right的字符放在下标为left的位置
第四步,将临时变量tmp的字符放在下标为right的位置
第五步,递归
思考:
为什么在交换之前先进行判断?
原因:当字符串的字符个数为偶数时,会出现中间的两个字符交换两次,导致逆序失败,因此在需要在交换之前进行判断。
1.2.1程序设计及实现
程序设计的N-S图如图1.4所示:
代码实现:
//双指针
void reverse(char string[], int left,int right)
{
if (left < right)
{
char tmp = string[left];
string[left] = string[right];
string[right] = tmp;
reverse(string, left+1, right-1);
}
}