C++面向对象程序设计
题目:用递归算法编写一个程序,实现字符串的反序。
#include<iostream>
#include<string.h>
using namespace std;
int opp_str(char *str, int n)
{
static int m = 0;
if (n <= m)
return 1;
char tmp = str[m];
str[m++] = str[n];
str[n] = tmp;
return opp_str(str, n - 1);
}
int main()
{
char str[100];
gets_s(str);
opp_str(str,strlen(str)-1);
puts(str);
return 0;
}
代码解释如下:
定义了一个内部静态变量m,并且初始化令m=0.
if函数体下面的三行代码和一般的交换函数概念相同,故不做解释。
在编写的递归函数中,实现了字符串的反序。需要注意的是,递归和循环一样其实都需要一个判别是否停止的条件。在这个递归函数中,假如字符串中需要排序的字符有8个。那第一轮递归是1号和8号交换顺序,然后2号(m)和7号(n)交换顺序,直到n小于m,比如4号和5号交换后的顺序是5(m)、4(n),此时递归已经结束了,你不能够把5、4的顺序再颠倒过来。
接下来是代码测试
输入任意,注意大小要小于定义的数组大小。可以看到,程序已经完美的达成了字符串反序这一目的。
最后,抛给大家一个问题。感兴趣的读者可以考虑一下。
其实我的代码已经比较精简了,但是在写的过程中我觉得还是有内容可以简化。这里m的定义是否是必须的?能否在递归函数的每一轮递归中,通过一个较好的逻辑表达代替掉m,从而实现更高的效率?
转载请声明作者:
北京理工大学-宇航学院-探测制导与控制技术-刘鹏飞
ID:翡翠的风吟
这门课程让我学到了很多细节,比直接看C++ primer plus的效率要高。并且老师也介绍了很多实用的方法,这让我实现大规模工程软件编程时,能够节省空间和提升效率,总的来说这门课选的不亏,但是和小学期一样依旧没有题目能让我花太多时间。所以,我还是比较期待课上能出一些比较有趣的算法题目。(平时在ROS上碰壁惯了,在这门课上找回了自信。)