如合使用递归函数实现字符串逆序排列?

目录

前言

一、问题阐述

二、问题分析

1.题目函数分析

2.题目要求分析

三、实现字符串逆序排列的代码&运行结果截图

总结


前言

今天想为大家分享最近学习递归时所遇到的一道比较有意义的题目的题目,之所以这么说是因为在这道题目中涉及了有关数组元素地址变换以及一些指针基础应用相关的一些内容,我觉得这对我们以后学习指针的相关知识以及数组元素在内存中的存储的方式是非常有帮助的。

除此之外呢,题目中还有一些有趣的特定的限制条件,需要我们自己通过自定义函数来实现某些库函数的功能。希望大家能跟着小风思路一起来理解这道经典例题吧!

一、问题阐述

题目描述:编写一个函数 reverse_string(char * string)(递归实现)

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

要求:不能使用C函数库中的字符串操作函数。

比如:

char arr[] = "abcdef";

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

二、问题分析

1.题目函数分析

通过题目要求函数的模式框架reverse_string(char * string)可以观察出其中的形参个数只有一个,并且形参的类型是字符型指针变量。

由此我们可以知道实参传递的形式必定是一个地址,那么这是一个谁的地址呢,显而易见,我们的操作对象是谁传递的地址必定与其相关,否则很难将二者之间建立起联系,因此传递的地址肯定是我们所要操作的那个需要逆序的字符型的数组的地址。

通过上述的分析,我们可以将形参的内容进行等价的转换一下,将其改成reverse_string(char arr[]),之所以这么改是因为我们知道当我们传递的实参是数组名时,实际上传递的是该数组得手元素地址,改变后的形参虽然变成了数组的形式,但它和原来的指针参数所发挥的作用是一样的,都是起到一个接收地址的作用,只不过这样我们将会更容易理解一些。

2.题目要求分析

首先题目要求这是一个递归函数,那么这个函数就必须得能够实现自身调用自己,这就需要我们找到其中递归条件(即中间重复使用的相似步骤)以及终止条件。因此解题步骤如下:

  1. 找出每对对应数组的元素位置。从题目函数分析可知,传进我们函数中的的内容是数组的其实元素的地址,此时我们就很有必要找到其对应数组最后一个元素的地址(注意并不是‘\0’),只有这样我们才能进一步实现将它们的位置对换存储的内容。
  2. 求出数组中除去‘\0’后实际元素的个数。可以说这也是题中所给我们设置的一道关卡,因为当我们遇到这种问题时想到可以直接使用头文件 #include<string.h> 中的strlen()库函数直接计算字符数组的长度,然后通过数组中元素位置的关系很容易找出对应的元素所在位置,但题目中明确规定不能使用C函数库中的字符串操作函数。因此在这里我们可以通过循环便利的方式来计算数组长度,每循环一次并且满足条件count++,当遍历到数组的元素为‘\0’时跳出循环。
  3. 递归开始。设置中间变量,用于存储数组前端元素的值,而该位置放入将需交换的数组末尾元素的值,空出末尾的位置赋值为'\0',为下一轮递归进行步骤2创造条件。下一轮递归函数reverse_string(char arr+1),首元素的位置向后移动一位
  4. 递归终止条件。当递归到两个元素之间最多包含一个元素时,递归终止,并且将向上回溯。
  5. 将冬临时变量tmp的值赋值给后端被赋值‘\0’的位置。通过这一步,层层递归后,原来位置所存储‘\0’将全部被对应的前端值所填充。

通过上图可知每一轮递归临时变量tmp都会存储这一层递归的前端值,因此不必担心数据丢失的情况发生。

三、实现字符串逆序排列的代码&运行结果截图

代码:

#include <stdio.h>

void reverse_string(char arr[])
{
	int count = 0;  //用于存储元素的个数
	int i = 0;
	char tmp = arr[0];  //临时变量,存储数组前段调换值

	//计算元素个数
	for (i = 0; arr[i] != '\0'; i++);  //当遇见'\0'时,循环终止
	count = i;

	//将后端值调换至对应的前端位置
	arr[0] = arr[count - 1];
	arr[count - 1] = '\0';
	//递归开始

	if (count >= 3)
		reverse_string(arr + 1);  //通过递归,已经将第一次递归时包含的中间值逆序了

	//最后将第一次进入函数时最后末尾的值完成调换
	arr[count - 1] = tmp;
}

int main()
{
	char arr[] = "abcdef";
	reverse_string(arr);  //传递数组首元素地址
	//输出
	printf("%s", arr);
	return 0;
}

运行结果:


总结

希望大家通过小风此次所分享的内容能对数组地址这一块内容的理解有所帮助!大家一起加油呀!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

whelloworldw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值