c语言-递归练习题

目录

  • 前言
  • 一、题目:递归实现字符串逆序
    • 1.1 解法一
      • 1.1.1 解题思路
      • 1.1.2 程序设计及实现
    • 1.2 解法二
      • 1.2.1 解题思路
      • 1.2.1程序设计及实现
  • 总结


前言

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

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

1.1 解法一

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

1.1.1 解题思路

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

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

思考

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

1.1.2 程序设计及实现

程序的N-S图如图1.2所示:
c语言-递归练习题_第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的位置
第五步,递归
c语言-递归练习题_第3张图片

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

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

1.2.1程序设计及实现

程序设计的N-S图如图1.4所示:
c语言-递归练习题_第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);
	}
}

总结

你可能感兴趣的:(c语言练习题,c语言)