递归算法的学习

此之前对递归的认识:
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;
}
    
 
值得注意的是,原博文方法三是没有递归出口的,最后是个空递归。那是个不好的样本。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值