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

题目大意是这样的:给定一个字符串使用递归的方法将字符串逆序,注意是不是逆序打印,并不使用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;
}

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值