规范化的递归转换成非递归
递归函数被调用时,系统需要一个运行栈。系统的运行栈要保存函数的返回地址,保存调用函数的局部变量,每一层递归调用所需保存的信息构成运行栈的一个工作记录,在没进入下一层递归调用是,系统就会建立一个新的工作记录,并把这个工作记录进栈成为运行栈新的栈顶,每返回一层递归调用,就退栈一个工作记录,因栈顶的工作记录必定是当前正在运行的递归函数的工作记录,所以栈顶的工作记录也称为活动记录。
对于此系统对于递归的处理,我们可以把它交个函数,这就可以实现规范化的递归转换成非递归
Example:
非递归求阶乘
//利用非递归求阶乘 #include<iostream> using namespace std; //结点 struct Node { int data; Node*next; }; //链表栈 class LinkStack { public: LinkStack() { top=new Node; top=NULL; } ~LinkStack() { delete top; } void push(int item); int pop(); bool isEmpty()const; private: Node *top; }; void LinkStack::push(int item) { Node *p=new Node; p->data=item; p->next=top; top=p; } int LinkStack::pop() { Node *p=top; int a=p->data; top=p->next; delete p; return a; } bool LinkStack::isEmpty()const { return top==NULL; } int main() { int n; cin>>n; LinkStack *s=new LinkStack; int result=1; while(n>0||!s->isEmpty()) { if(n>0) { s->push(n); n--; } else result*=s->pop(); } cout<<result<<endl; return 0; }