前言
😽很简单的逆序字符串实现,记录一种不容易想到的递归思路!
实现要求:
将参数字符串中的字符反向排列,不是逆序打印。
比如:char arr[ ] = “abcdef”;
逆序之后数组的内容变成:fedcba
思路1:
抓住递归的核心思想将事件大事化小,要将整个字符串逆序,可以先将字符串中的首字符和末字符交换,再将中间的字符串再逆置;
而中间的字符串可以再次用上面的思路递归,直到首尾符的中间再没有字符串;
要想将中间的内容再当成一个字符串进行递归,就需要在其后在其后放置一个\0,而因为要放置这个\0,首字符就无法放置在字符串末尾完成交换,此时可以将这个字符用一个中间变量存储起来,等到中间的字符串递归完成逆序后,再将存储起来的首字符放到末字符的位置。
#include<stdio.h> #include<assert.h> #include<string.h> void reverse(char* str) { assert(str); char tmp = *str; int len = strlen(str); *str = *(str + len - 1); *(str+len - 1) = '\0'; if (my_strlen(str + 1) >= 2) { reverse(str + 1); } *(str + len - 1) = tmp; } int main() { char arr[] = "abcdefg"; reverse(arr); printf("%s\n", arr); return 0; }
思路2:
实现一个递归函数将字符串俩俩交换即可。
#include<stdio.h> #include<assert.h> #include<string.h> void reverse(char arr[], int left, int right) { assert(arr); if (left < right) { char tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp; reverse(arr, left + 1, right - 1); } } int main() { char arr[] = "abcdefg"; int left = 0; int right = strlen(arr)-1; reverse(arr, left, right); printf("%s\n", arr); return 0; }