字符串逆序(递归实现)

题目即要求

字符串逆序(递归实现),不能使用C函数库中的字符串操作函数。 char arr [] =“abedef” 逆序之后数组的内容变成: fedcba

先分析题目,如果不用递归如何实现?

双指针,一个从头走,一个从尾走,交换两个元素,直接贴代码

void reverse_string2(char* arr)
{
	int len=strlen(arr);
	int left=0,right=len-1;
	
	while(left<right)//<=都可,因为当left>right或是=right时,一个元素或者小于一个元素的交换都一样  
	{
		//交换左右变量 
		int temp=arr[left];
		arr[left]=arr[right];
		arr[right]=temp;
		
		left++;
		right--;
	} 
}

那么,问题来了,用递归怎么实现呢.先来看下我画的粗略图:(

字符串逆序(递归实现)_第1张图片

依次解释下操作

  1. 将第一个元素存放在临时变量中.
  2. 将最后一个元素放在首位
  3. 将最后一个元素的位置置为\0,表明字符串结束位置
  4. 开始递归,将当前指针向后指一位,如图,a-b
  5. 从后一位开始递归,重复上述操作,因为表明了字符串结束位置,所以是从b-e的遍历
  6. 此时将最后一个元素,也就是\0,替换成临时变量中的第一个元素

注意

  • 第三步和第五步不能反,必须是第三步在第五步前,否则就会变成b-a(a已经同f交换过),而达不到我们想要的效果
  • 接着,因为此处是递归,递归的两个基本条件,只满足了一个逐渐逼近条件,却没有写结束递归的条件

这里递归的结束条件就是数组的长度要大于等于2,因为小于2的逆序没有意义.

下面是代码

void reverse_string(char* arr)
{
	char temp=*arr;//首元素存放好 
	int len=strlen(arr);
	*arr=*(arr+len-1);//最后一个元素到首位 
	*(arr+len-1)='\0';//最后一个元素等于\0,给定下次遍历的右范围 
	if(strlen(arr+1)>=2)
	{
		reverse_string(arr+1);//给定下次遍历的左范围 
	}	
	
	*(arr+len-1)=temp;//把当前的最后元素,也就是\0,替换成首元素 
}

你可能感兴趣的:(算法,数据结构)