规范化的递归转换成非递归

递归函数被调用时,系统需要一个运行栈。系统的运行栈要保存函数的返回地址,保存调用函数的局部变量,每一层递归调用所需保存的信息构成运行栈的一个工作记录,在没进入下一层递归调用是,系统就会建立一个新的工作记录,并把这个工作记录进栈成为运行栈新的栈顶,每返回一层递归调用,就退栈一个工作记录,因栈顶的工作记录必定是当前正在运行的递归函数的工作记录,所以栈顶的工作记录也称为活动记录。

对于此系统对于递归的处理,我们可以把它交个函数,这就可以实现规范化的递归转换成非递归

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;
}
原文地址:https://www.cnblogs.com/KennyRom/p/5920147.html