思路:对于一个字符串,先将字符串的首元素保存起来,实际上就是压入堆栈,因为递归是通过堆栈实现的,然后将最后一个元素赋给首元素,
此时完成了首元素和最后一个元素的交换,然后将最后一个元素赋字符串的结束标志’\0’,然后字符的首地址加1,指向下一个元素,这时就有了一个长度减小的新的字符串,问题的规模会不断减小,递归的出口条件是字符串的长度小于2
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
void reverse(char *pstr)
{
char tmp = 0;
char *pstr_end = pstr + strlen(pstr) - 1;
assert(pstr);
if (strlen(pstr) < 2)//新字符串的长度小于2这时递归的出口条件
{
return;
}
else
{
tmp = *pstr;//将字符串的首元素先保存起来
*pstr = *pstr_end;//将此时字符串的最后一个元素赋给字符串的首元素
*pstr_end = '\0';//将字符串结束标记赋给此时的最后一个元素,字符串的长度不断减小
reverse(++pstr);
*pstr_end = tmp;//递归结束后将新字符串的首元素再赋给此时的最后一个元素,也就是此时为'\0'的元素
}
}
int main()
{
char msg[] = "abcdefg";
printf("before : %s\n",msg);
reverse(msg);
printf("after : %s\n",msg);
system("pause");
return 0;
}
如果有理解错或者理解不到位的地方,还请大家可以指出来,共同进步。