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


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

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

    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;
    }
    
  • 相关阅读:
    Leetcode 1191 K次串联后的最大子数组之和 Kadane 算法
    剑指Offer 38 字符串的排列
    explain结果每个字段的含义说明
    Timsort算法
    synchorized的锁升级
    进程IPC通信方式7种
    死锁知识点总结
    java中各种锁介绍
    运算符优先级记录
    C++ auto关键字
  • 原文地址:https://www.cnblogs.com/KennyRom/p/5920147.html
Copyright © 2020-2023  润新知