【C】逆序字符串(俩种递归思路)

简介: 【C】逆序字符串(俩种递归思路)

前言

😽很简单的逆序字符串实现,记录一种不容易想到的递归思路!

实现要求:

将参数字符串中的字符反向排列,不是逆序打印。

比如:char arr[ ] = “abcdef”;

逆序之后数组的内容变成:fedcba

思路1:

抓住递归的核心思想将事件大事化小,要将整个字符串逆序,可以先将字符串中的首字符和末字符交换,再将中间的字符串再逆置;

而中间的字符串可以再次用上面的思路递归,直到首尾符的中间再没有字符串;73d8c9be8b2a4960a39693770de0ac9a.png

要想将中间的内容再当成一个字符串进行递归,就需要在其后在其后放置一个\0,而因为要放置这个\0,首字符就无法放置在字符串末尾完成交换,此时可以将这个字符用一个中间变量存储起来,等到中间的字符串递归完成逆序后,再将存储起来的首字符放到末字符的位置。

73d8c9be8b2a4960a39693770de0ac9a.png

#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:

实现一个递归函数将字符串俩俩交换即可。

73d8c9be8b2a4960a39693770de0ac9a.png

#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;
}


目录
相关文章
|
3月前
|
测试技术 Perl
【动态规划】【记忆化搜索】【回文】1312让字符串成为回文串的最少插入次数
【动态规划】【记忆化搜索】【回文】1312让字符串成为回文串的最少插入次数
|
4月前
|
人工智能 算法 BI
【前缀和】【分类讨论】【二分查找】2983:回文串重新排列查询
【前缀和】【分类讨论】【二分查找】2983:回文串重新排列查询
|
10月前
|
算法 C语言
C语言:使用 普通方法 和 二分查找算法(折半查找算法) 在一个有序数组中查找具体的某个数字n-2
第一步: (1). 设置初始数组:int arr[]。 (2). 生成相关变量: int n = 0; -- 存放从键盘输入的要查找的值; int i = 0; -- 循环变量;
|
9月前
|
存储 Java C语言
|
10月前
|
算法 搜索推荐
【算法】非递归堆排序判断字符串中所有字符是否只出现一次
【算法】非递归堆排序判断字符串中所有字符是否只出现一次
35 0
|
10月前
|
算法 C语言
C语言:使用 普通方法 和 二分查找算法(折半查找算法) 在一个有序数组中查找具体的某个数字n-1
思路一:普通方法 (逻辑简单,在无序数组中也可以使用,但效率较低,需要逐个查找) 总体思路:
|
10月前
|
算法
【算法】用递归的方法逆序输出或倒置一个栈
【算法】用递归的方法逆序输出或倒置一个栈
93 0
【算法】用递归的方法逆序输出或倒置一个栈
|
10月前
力扣82删除排序链表中的重复元素 II:思路分析+代码实现+方法总结(三指针法&快慢指针法【双指针】&递归法)
力扣82删除排序链表中的重复元素 II:思路分析+代码实现+方法总结(三指针法&快慢指针法【双指针】&递归法)
43 0
|
10月前
力扣83删除排序链表中的重复元素:代码实现+思路分析+方法总结(快慢指针法&递归)
力扣83删除排序链表中的重复元素:代码实现+思路分析+方法总结(快慢指针法&递归)
44 0
|
11月前
|
算法 程序员 数据处理
字符串的全部子序列(递归)
在计算机科学中,子序列和子串的概念非常重要,这两个概念经常在数据处理,文本分析,编程算法等领域被广泛使用。理解子序列和子串的区别以及如何高效地处理它们对于成为一名有效的程序员是非常重要的。
128 0