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


目录
相关文章
|
1月前
|
Python
递归魔法:判断字符串是否为回文
本文介绍了如何使用递归判断一个字符串是否是回文。回文字符串是指正读和反读都相同的字符串。文章详细讲解了递归的基本思想和Python实现,并通过多个示例验证了函数的正确性。递归方法通过将大问题分解成更小的子问题,使得判断回文变得简单高效。
57 5
|
7月前
|
算法 程序员 索引
【算法训练-二分查找 一】【基本二分】二分查找、在排序数组中查找元素的第一个和最后一个位置
【算法训练-二分查找 一】【基本二分】二分查找、在排序数组中查找元素的第一个和最后一个位置
61 0
【递归进阶练习】全排列
【递归进阶练习】全排列
54 0
|
算法 搜索推荐
【算法】非递归堆排序判断字符串中所有字符是否只出现一次
【算法】非递归堆排序判断字符串中所有字符是否只出现一次
53 0
力扣82删除排序链表中的重复元素 II:思路分析+代码实现+方法总结(三指针法&快慢指针法【双指针】&递归法)
力扣82删除排序链表中的重复元素 II:思路分析+代码实现+方法总结(三指针法&快慢指针法【双指针】&递归法)
76 0
力扣83删除排序链表中的重复元素:代码实现+思路分析+方法总结(快慢指针法&递归)
力扣83删除排序链表中的重复元素:代码实现+思路分析+方法总结(快慢指针法&递归)
65 0
|
算法 程序员 数据处理
字符串的全部子序列(递归)
在计算机科学中,子序列和子串的概念非常重要,这两个概念经常在数据处理,文本分析,编程算法等领域被广泛使用。理解子序列和子串的区别以及如何高效地处理它们对于成为一名有效的程序员是非常重要的。
207 0
字符串的逆序(循环和递归两种解法)
字符串的逆序(循环和递归两种解法)
205 0
复习C部分:1.for循环 2.do while循环语句 3.在一个有序数组中查找某个数,例如在1~10之间找7(例题包含计算n的阶乘+打印1~10的奇数+二分法)
复习C部分:1.for循环 2.do while循环语句 3.在一个有序数组中查找某个数,例如在1~10之间找7(例题包含计算n的阶乘+打印1~10的奇数+二分法)
120 0
复习C部分:1.for循环 2.do while循环语句 3.在一个有序数组中查找某个数,例如在1~10之间找7(例题包含计算n的阶乘+打印1~10的奇数+二分法)
|
算法
【Day24】 LeetCode算法题 (注释详细+解题思路)[43. 字符串相乘 ] [1800. 最大升序子数组和]
学习 (注释详细+解题思路)[43. 字符串相乘 ] [1800. 最大升序子数组和]。
136 0
【Day24】 LeetCode算法题 (注释详细+解题思路)[43. 字符串相乘 ] [1800. 最大升序子数组和]