栈模拟递归求阶乘问题

warning: 这篇文章距离上次修改已过424天,其中的内容可能已经有所变动。
#include<iostream>
#include<stack>
using namespace std;
 
typedef struct{
    int n;//保存n值
    int f;//保存f(x)值
    int flag;//标记当前递归层是否可求出结果(1为已知,0为未知)
}fst;
 
int fun(int n){
    fst e,e1,e2;
    stack<fst>st;
    e.n=n;
    e.flag=0;
    st.push(e);//f(n)入栈
    while(!st.empty()){
        if(st.top().flag==0)//当前栈顶元素值未知时
        {
            if(st.top().n==1)//当前栈顶元素为f(1)时
            {
                st.top().f=1;
                st.top().flag=1;
            }
            else
            {
                e1.n=st.top().n-1;
                e1.flag=0;
                st.push(e1);//f(n-1)入栈
            }
        }
        else
        {
            e2=st.top();
            st.pop();//退栈
            st.top().f=st.top().n*e2.f;//f(n)=f(n-1)*n
            st.top().flag=1;
        }
        if(st.size()==1&&st.top().flag==1)
            break;
    }
    return(st.top().f);
}
 
int main(){
    int n;
    cout<<"请输入n的值:";
    cin>>n;
    cout<<n<<"的阶乘为"<<fun(n);
}

图1图1

-------该算法摘自《算法设计与分析(第2版)》

none
最后修改于:2023年11月25日 18:27

评论已关闭