规范化的递归转换成非递归
递归函数被调用时,系统需要一个运行栈。系统的运行栈要保存函数的返回地址,保存调用函数的局部变量,每一层递归调用所需保存的信息构成运行栈的一个工作记录,在没进入下一层递归调用是,系统就会建立一个新的工作记录,并把这个工作记录进栈成为运行栈新的栈顶,每返回一层递归调用,就退栈一个工作记录,因栈顶的工作记录必定是当前正在运行的递归函数的工作记录,所以栈顶的工作记录也称为活动记录。
对于此系统对于递归的处理,我们可以把它交个函数,这就可以实现规范化的递归转换成非递归
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;
}

浙公网安备 33010602011771号