实现字符逆序输出 (递归分治篇)------- 算法笔记014

问题引出

给定输入字符串:changlon love you !#
以#号结尾
要求程序读取并逆序输出 如: ! uoy evol nolgnahc

我们有两种思路解决这个问题,第一种是先声明一块缓冲区,字符一次读入,最后从末尾处向前索引一次输出就是完成了一次读取再逆序输出的操作了。实现代码如下。

#define MAX 1024
void Print(){
	char * str=(char *)malloc(sizeof(char)*MAX);			
	int i=0;
	char ch;
	printf("输入一段字符逆序输出(以#号结尾):");
	scanf("%c",&ch);
	while(ch!='#'){
		str[i]=ch;
		scanf("%c",&ch);
		i++;
	}
	for(--i;i>=0;i--){
		printf("%c",str[i]);
	}
}

对于这种题目,这是一段非常简单的设计!那么我们除了可以通过循环迭代,我们还有没有其他的方法来实现这么一个要求呢?我们也可以使用递归算法来实现。
如果用递归的话那么我们就需要一个结束递归的条件,想一想这个条件应该怎么设计呢?我们的读写都是在Print这个函数里面执行的。我们读到#字符都读完了,所以读到#号程序就应该递归返回!

void Print(){
	char ch;
	scanf("%c",&ch);
	if(ch=='#'){
		return;
	}
	//如果不是#我们让程序继续递归下去
	Print();
	//在所有的递归都结束时,才打印字符
	//假如说我们这是最后一次递归,ch=='#'那么在上面就会返回,来到倒数第二层的函数栈上
	//相当于最后一层Print()结束了,继续往下面执行,这时候打印的是输入流中最后一个字符
	//然后一次向上返回
	printf("%c",ch);

}

可以发现我们使用递归使代码更加简洁,空间的复杂度就是我们输入字符的数量,但在算法上十分简洁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智者_若愚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值