当前位置:主页 > 查看内容

用递归的方法实现字符串的逆序(不调用库函数)

发布时间:2021-09-18 00:00| 位朋友查看

简介:题目大意是这样的给定一个字符串使用递归的方法将字符串逆序注意是不是逆序打印并不使用string.h的库函数 思路字符串逆序首先要知道字符串数组的长度又不能调用库函数顾需要自己写一个能实现strlen的函数使逆序函数调用所以需要两个函数 1. 能求出字符串数组……

题目大意是这样的:给定一个字符串使用递归的方法将字符串逆序,注意是不是逆序打印,并不使用string.h的库函数

思路:字符串逆序首先要知道字符串数组的长度,又不能调用库函数,顾需要自己写一个能实现strlen的函数,使逆序函数调用,所以需要两个函数:

                                          1. 能求出字符串数组长度的数组
                                         2. 实现字符串逆序的函数(调用第一个函数来得到数组长度)

实现第一个函数:
这个函数其实很简单可以用递归来实现也可以用循环来实现我这里就直接放出源码了

                                                             递归实现:
int my_strlen(char *p)
{
	int n = 0;
	if (*p != '\0')
	{
		return 1+my_strlen(p + 1);
	}
	else
	{
		return 0;
	}
}
                                                 循环实现
int my_strlen(char* p)
{
	int n = 0;
	while (*p != '\0')
	{
		n += 1;
		p++;
	}
	return n;
}

实现第二个函数:
假设我们要使字符串“abcdefg”逆序,逆序实际上是交换首尾的字符,顾设第一个字符和最后一个字符分别序号为 left =0 和 right=my_strlen§-1 ,将最右边的字符即p[right]与p[left]交换,然后递归fun(p+1),但是如果这样做,我们会发现左边边的指针移向了下一位,但是右边的还停留在上一个,而如果要使做右边指针移动必须知道递归次数,这样非常不方便,如图

void reverse(char* p)
{
	int left = 0;
	int right = my_strlen(p)-1;
	char temp;
	temp = p[left];
	p[left] = p[right];
	p[right] = temp;
	reverse(p+1);
}

如果右边指针能随着递归次数增加而自己往左边移动这个问题就迎刃而解了,这时就有一个巧妙的方法:

我们将p[left]的值存入temp, 并将p[right]赋值给p[left], 然后令p[right]=’\0’

void reverse(char* p)
{
	int left = 0;
	int right = my_strlen(p)-1;
	char temp;
	temp = p[left];
	p[left] = p[right];
	p[right] = '\0';
		reverse(p + 1);
	p[right] = temp;
}

这样p+1进入下一次递归时,由于my_strlen()函数只能返回’\0’前字符的个数, 使p[right]指针往左移了一位效果如图

在这里插入图片描述
这是进行了多次递归,如果没有对递归进行限制函数会进入死循环,顾要满足一定条件才能进入reverse(p+1),而这个条件很明显是my-strlen§>1,如果字符串长度小于一就没有交换的必要了。
在这里插入图片描述

void reverse(char* p)
{
	int left = 0;
	int right = my_strlen(p)-1;
	char temp;
	temp = p[left];
	p[left] = p[right];
	p[right] = '\0';
	if (right>0)
	{
		reverse(p + 1);
	}
	p[right] = temp;
}

最终递归的流程如图:
在这里插入图片描述

最终代码:

#include<stdio.h> //递归使字符串逆序
int my_strlen(char *p)
{
	int n = 0;
	if (*p != '\0')
	{
		return 1+my_strlen(p + 1);
	}
	else
	{
		return 0;
	}
}
void reverse(char* p)
{
	int left = 0;
	int right = my_strlen(p)-1;
	char temp;
	temp = p[left];
	p[left] = p[right];
	p[right] = '\0';
	if (right>0)
	{
		reverse(p + 1);
	}
	p[right] = temp;
}
int main()
{
	char arr[] = "abcdefg";
	reverse(arr);
	printf("%s", arr);
	return 0;
}

有错误欢迎大家指正,谢谢

;原文链接:https://blog.csdn.net/qq_51086532/article/details/116029211
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!
上一篇:一个Bug,让我发现了 Java 界的.AJ(锥)! 下一篇:没有了

推荐图文


随机推荐