c语言-递归练习题


前言

本篇文章叙述利用递归解决问题的例子。

一、题目:递归实现字符串逆序

1.1 解法一

使用递归将一个字符串逆序
函数名:reverse(char* string)
要求:不能使用库函数

1.1.1 解题思路

假设字符串为:abcd\0
第一步:将字符串的第一个字符保存到临时变量中
第二步:将字符串的最后一个字符放到string指向的位置
第三步:用\0字符替代当前字符串的最后一个字符
第四步:判断字符串的长度是否小于2,以此判断是否进行递归
第五步:将tmp的值放在当前字符串的最后一个位置。
下面是流程分析图。如图1.1所示:
在这里插入图片描述

图1.1 字符串逆序解法一分析图

思考

  1. 为什么要将\0放在当前字符串的最后一个位置?
    为了便于下一次递归的字符串正确计算出长度,以便第一个和最后一个字符的交换。

1.1.2 程序设计及实现

程序的N-S图如图1.2所示:
在这里插入图片描述

图1.2 字符串逆序解法一N-S图

代码实现如下:

//求一个字符串的长度
int my_strlen(char* string)
{
	int count = 0;
	while (*string != '\0')
	{
		count++;
		string++;
	}
		
	return count;
}

//只有一个参数
void reverse(char* string)
{
	int len = my_strlen(string);
	char tmp = *string;  //保存第一个元素
	*string = *(string + (len-1)); //将字符串的最后一个位置的值移动到第一个位置
	*(string + (len - 1)) = '\0';
	if (my_strlen(string+1) >= 2)
		reverse(string+1);
	*(string + (len - 1)) = tmp;
}

1.2 解法二

使用递归将一个字符串逆序
函数名:reverse(char string,int left,int right)
要求:不能使用库函数

1.2.1 解题思路

假设字符串为abcd\0
第一步,判断left是否小于right,以此判断是否进行交换并进行递归
第二步,将下标为left的字符放在临时变量tmp中
第三 步,将下标为right的字符放在下标为left的位置
第四步,将临时变量tmp的字符放在下标为right的位置
第五步,递归
在这里插入图片描述

图1.3 字符串逆序解法二分析图

思考:
为什么在交换之前先进行判断?
原因:当字符串的字符个数为偶数时,会出现中间的两个字符交换两次,导致逆序失败,因此在需要在交换之前进行判断。

1.2.1程序设计及实现

程序设计的N-S图如图1.4所示:
在这里插入图片描述

图1.4 字符串逆序解法二N-S图

代码实现:

//双指针
void reverse(char string[], int left,int right)
{  
	if (left < right)
	{
		char tmp = string[left];
		string[left] = string[right];
		string[right] = tmp;
		reverse(string, left+1, right-1);
	}
}

总结

  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值