递归算法的学习

此之前对递归的认识:
1.递归可以通过参数实现循环结构那种计数器进行替换
2.简单的尾递归与迭代等价,空间资源消耗也一样
3.相对于迭代常用的循环结构,递归用判断结构,并且要有出口

题目:编写函数void reverse(string&s),用递归算法使字符串s倒序

一开始思考进行怎么做时就觉得参数不够用,函数的形式不正确,因为没法对字符串的下标进行迭代。然后写了个辅助函数带一堆参数,觉得很别扭。(实现下标自增or自减、交换函数)
然后同学百度到了这篇博文编写函数void reverse( string& s),发现了他用全局变量实现了和参数传值同样的功能——下标运算。
同时他的方法一中并没有见到平凡的函数出口return。(其实此时我连void函数的返回是用return而不是return 0都不晓得)然而他实现的是函数的倒序——输出。。与题意并不吻合。
然而实际上倒序输出已经用到了之前我所不知的核心条件——参数不够怎么进行下标运算——用static之类的静态、全局变量即可!
然后就是在里面弄个交换功能,并且学习原博文那样,把函数的自身调用写进判断结构中,就实现了不用return的函数出口
代码如下:

<span style="font-size:18px;">//  题目要求:编写函数 void reverse(string &s),用 递归算法 使字符串s倒序</span>

#include <iostream>
#include <string>
using namespace std;

void reverse( string &s) {
	static int k=s.length();
	if(k >= s.length()/2){
		char a=s[k];
		s[k] = s[s.length()-k-1];
		s[s.length()-k-1] = a;
		k--;
		reverse(s);}
} 


int main() {

	string str;
	cout<<"请输入字符串: "<<endl;
	cin >>str;
	cout<<"倒序后的字符串为:";
	reverse(str);
	cout<<str<<endl;
	return 0;
}
    
 

值得注意的是,原博文方法三是没有递归出口的,最后是个空递归。那是个不好的样本。

点赞