今天又写了个C++中关于字符串倒序输出的,要求用递归算法求解!
关于递归,以前也思考了很久自以为已经理解好了,但是今天做题还是磕磕碰碰,不能够快速的反应过来,所以觉着有必要好好总结下,写出自己认为的最好理解方式!
当然大家都知道,递归的本质和栈数据的存取很相似了,都是先进去,但是往往最后处理!再者对于递归函数的局部变量的存储是按照栈的方式去存的,对于每一层的递归函数在栈中都保存了本层函数的局部变量,一边该层递归函数结束时能够保存原来该层的数据!如图:
如上图递归式依次往下进行的,并且在该层递归函数还没结束即将进入下一层递归调用时,将会把该层函数中的局部变量保存起来,以供下次使用!
好了,以上是递归函数的数据存储方式,可是有时候我们又得抓头了,递归的话,有时候又很难理解,貌似总也想不通!
于是我又把每一层递归函数化分为三部分了,第一部分:是递归调用前的一些数据处理,判断以及递归结束判断(当然了结束条件肯定在递归调用前,要不每次递归就不会结束了),第二部分:就是递归函数本身了。而第三部分:当然就是递归函数的后续处理代码了!在这里我想我们得想明白一件事情了,每一层的函数都是在上一层递归函数结束时才返回的然后接着处理该层递归函数剩下的部分!例如如下代码:
#include<iostream>
#include<string>
using namespace std;
int i=0,j;
void reverse(string &s);
int main()
{
string s;
cin>>s;
j=i=s.size();
reverse(s);
cout<<s<<endl;
return 0;
}
void reverse(string &s)
{
char ch; //..........第一部分 ..........
i--;
ch=s[i];
cout<<ch<<endl; //这里i是全局变量,而ch是局部变量会保存在栈中
if(-1==i)
return;
reverse(s); //本身的递归看做第二部分
//后续部分看做第三部分
s[--j]=ch; //这句当且仅当该递归函数中的reverse返回时 才执行
cout<<ch<<endl;
}
在以上代码中,每一层只有当reverse()结束了才会接着处理下面的s[--j]=ch;代码,因为每一次递归进去的时候reverse()上面的代码都已经处理了,所以当递归返回时处理的自然就是reverse()下面的代码了,如此循环直到结束!不过我觉着最重要的还有一样就是有时候不必刻意去关注的那么细,也要有全局观,例如我们只需要知道函数reverse()是继续处理同样的功能,没必要再去想这个函数里面又是怎么样怎么样的,我感觉肯定会抓狂的!希望跟我一样纠结的朋友不在纠结递归了.........说明:本人新手,如有不当之处,望指点,谢谢....^.^