规范化的递归转换成非递归
生活随笔
收集整理的這篇文章主要介紹了
规范化的递归转换成非递归
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
遞歸函數被調用時,系統需要一個運行棧。系統的運行棧要保存函數的返回地址,保存調用函數的局部變量,每一層遞歸調用所需保存的信息構成運行棧的一個工作記錄,在沒進入下一層遞歸調用是,系統就會建立一個新的工作記錄,并把這個工作記錄進棧成為運行棧新的棧頂,每返回一層遞歸調用,就退棧一個工作記錄,因棧頂的工作記錄必定是當前正在運行的遞歸函數的工作記錄,所以棧頂的工作記錄也稱為活動記錄。
?
對于此系統對于遞歸的處理,我們可以把它交個函數,這就可以實現規范化的遞歸轉換成非遞歸
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
總結
以上是生活随笔為你收集整理的规范化的递归转换成非递归的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vs2015上使用github进行版本控
- 下一篇: JavaOne 2016——首日亮点