问题引出
给定输入字符串: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);
}
可以发现我们使用递归使代码更加简洁,空间的复杂度就是我们输入字符的数量,但在算法上十分简洁。