java递归逆置字符串_通过递归的方式将字符串逆置打印

逆置打印字符串是有很多种方法的,个人感觉使用递归的方式很可以很容易的去理解栈的创建与析构,所以就稍微建立了模型;

首先我们先看看理论:

递归模型:

1. 递归模型即是对自己本身的调用,一般用在函数或子函数函数的内部;

2. 每调用一次函数,编译器就会分配另一个栈或堆空间;

3. 当遇到终止条件时就开始析构函数(必须有终止条件,否则会无限分配空间内存,导致内存空间溢出,从而导致死机);

有一个字符串"abcde",我们要将它逆置打印,也就是输出edcba,这里我们先用一个简单点的方法,通过数组的下标来打印,即将数据copy到一个数组中(数组足够大),直接将下标移到最后的位置,一个一个的往前打印;

如下:

1 #define _CRT_SECURE_NO_WARNINGS

2 #include

3 #include

4 #include

5

6

7 voidmain()8 {9 //1.通过下标逆置

10 char *str = "abcde"; //一级指针指向字符串常量

11 char p[10] = {0}; //一维数组并初始化为空,防止出现乱码

12 int len = 0; //计算数据长度

13 int i = 0; //for循环打印数据

14 strcpy(p,str); //将数据copy到数组中

15 len = strlen(str) - 1; //算出字符串的长度因为,下标是从0开始,所以减一

16

17 for(i = len ; i >= 0; i--)//直接通过下标逆置

18 {19 printf("%c",p[i]); //依序打印数据

20 }21 system("pause");22 return;23

24

25 }

这个应该很容易看懂,所以我就不多做解释了,也可以通过指针来读取数据,在建立一个辅助指针变量,因为str指向字符串首地址,所以将新建的指针指向末地址,然后就和打印数组一样,一个一个的往后移,或者是直接逆置copy到一个数组中等等(切记,“abcde”是字符串常量,它拥有只读属性,也就是说不能修改它所在的内存空间只能读取数据);

接下来就是我们要将的递归逆置打印,其实这个打印方法和数组打印很想,但是一个是正方向传递地址,一个是倒着传递地址:

1 #define _CRT_SECURE_NO_WARNINGS

2 #include

3 #include

4 #include

5

6 int inversion(char *p);//接受的是地址

7

8 intmain()9 {10 char *str = "abcde";//将指针指向字符串常量

11

12 inversion(str);//传递的是地址

13

14 system("pause");15 return 0;16 }17

18 int inversion(char *p)19 {20 char *str;21 if(*p == '\0')//如果没有数据就返回

22 {23 return 0;24 }25 str = p;//将p所指向的地址赋给str

26 inversion(p+1);//因为参数是指针所以将地址赋给它

27 printf("%c",*str);28 return 0;29 }

这里一定要记住一点,调用函数时inversion时,调用它的栈是不会被析构掉的,而通过它则建立了一个新的栈空间,除非一整个函数体运行或者遇到终止命令,不然不会被析构掉,也就是说每建立一个新的栈区,从中分配str和p已经和上一个栈区的变量没有关系了。也就是说str每次指向的都是新传递过来的地址,图如下:

933afccf8e1c660aa6ba75bd5eb7a539.png

因为建立了新的栈区所以每次用来接受地址的p已经和上一个栈中的p没有关系了,它已经指向了一个新的地址,当函数遇到终止命令或者运行完时就会被自动的析构掉;

其实因为我们传递过去的是一个字符串常量,所以我们在写函数参数是可以这样写int inversion(const char *p);声明一下我这个是只读常量,或者说用const修饰告诉别人

不允许修改我这个指针所指向的空间数据;其实在C中const是有歧义的,这个在之前的C++中的const和C中的区别我稍微写过一点,因该是C++中对于const进行了功能加强。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值