回 帖 发 新 帖 刷新版面

主题:求教各位高手,如何将递归算法转换成非递归的算法?

请问,如何将递归算法转换成非递归算法呢?
    我在书上看到的说是有两种,一种是功能模拟递归,就是把要求写的函数的功能分析
出来再写成一般的非递归的算法;另外一种是形式模拟递归,就是用写栈的方法来完成;
那么通常来说用第一种方法,分析功能,有些函数也许是很复杂的,推理的过程很烦琐;
而第二种方法,堆栈的算法似乎更是从递归运行的过程来考虑的,那其中设计地址的出入
也是很复杂的,特别是对于递归当中又有递归,我对这第二种方法更是云里雾里的,想请教
哈各位高手,一般是用什么办法呢?
    对于栈的方式,有没有什么要点,特别是地址的出入是怎么设计的呢,请指教!
    非常感谢!!

回复列表 (共4个回复)

沙发

对进栈和出栈设置标志flag,比如出栈几次就可以访问等等。。。

板凳

用了栈根本用不着地址记录,否则和递归有什么区别。。。

3 楼

模块就是这样:
//递归=>非递归
function()
{
    Stack S;
    InitStack(S);
    push(S,s0);//初始状态s0
    while(!EmptyStack())
    {
        pop(S,s);
        if(s==demanded())
            return;
        else
        {
            convert(s,s1);//次状态s1
            push(s1);
        }
    }                                        
}

4 楼

如果化成了非递归而时间复杂度没改善,就不要化了,用系统栈方便得多,汇编的那些个压栈指令比你自己写栈快得多,得不尝失,不然还要堆栈段干嘛。

我来回复

您尚未登录,请登录后再回复。点此登录或注册