zoukankan      html  css  js  c++  java
  • 用栈实现递归算法(第一版)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace TEST
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.Write(GetFoo(10));
    
                Console.Read();
            }
            //
            static long GetFoo(int n)
            {
                if (IsLeaf(n))
                {
                    return GetLeafvalue(n);
                }
                //结果保存栈
                Stack<long[]> resultStack = new Stack<long[]>();
    
                //临时结果数组
                long[] tempResultArry = InitTempResultArry();
    
                //压入临时结果数组
                resultStack.Push(tempResultArry);
    
                //临时节点栈
                Stack<int> tempNodeStack = new Stack<int>();
    
                //压入根节点
                tempNodeStack.Push(n);
    
                //遍历临时节点
                while (tempNodeStack.Count > 0)
                {
                    tempResultArry = resultStack.Last();
                    int branchIndex = GetNodeBranchIndex(tempResultArry);
    
                    //当前节点遍历完成
                    if (branchIndex == -1)
                    {
                        if (resultStack.Count == 1)
                        {
                            break;
                        }
                        else
                        {
                            tempNodeStack.Pop();
                            resultStack.Pop();
                            //branchIndex = GetNodeBranchIndex(tempResultArry);
    
                            //把结果赋值给上层
                            //tempResultArry = resultStack.Last();
    
                            long tempResult = CalculateResult(tempResultArry);
                            tempResultArry[1] = tempResultArry[0];
                            tempResultArry[0] = tempResult;
                        }
                    }
                    else
                    {
                        //没完成,得到要遍历的下一个节点
                        int currentNode = tempNodeStack.First();
                        int nextNode = GetSubNode(currentNode, branchIndex);
    
                        if (IsLeaf(nextNode))
                        {
                            tempResultArry[branchIndex] = GetLeafvalue(nextNode);
                        }
                        else
                        {
                            tempNodeStack.Push(nextNode);
                            resultStack.Push(InitTempResultArry());
                        }
    
                    }
    
    
                }
                return CalculateResult(resultStack.First());
            }
    
            //
            static bool IsLeaf(int n)
            {
                return n < 3;
            }
            //
            static int GetNodeBranchIndex(long[] tempNodeResultArry)
            {
                for (int i = 0; i < tempNodeResultArry.Length; i++)
                {
                    if (tempNodeResultArry[i] == -1)
                    {
                        return i;
                    }
                }
                return -1;//表示没有遍历完成
            }
    
            //
            static int GetSubNode(int node, int branchIndex)
            {
                return node - branchIndex - 1;
            }
            //
            static long GetLeafvalue(int n)
            {
                return 1;
            }
            //
            static long[] InitTempResultArry()
            {
                long[] tempResultArry = new long[2];
                for (int i = 0; i < 2; i++)
                {
                    tempResultArry[i] = -1;
                }
                return tempResultArry;
            }
    
            static long CalculateResult(long[] tmpResults)
            {
                long retValue = 0;
                for (int i = 0; i < 2; i++)
                {
                    retValue += tmpResults[i];
                }
                return retValue;
            }
    
        }
    }
    参考资料:

    -------------------------------------------------------------------------------------------------------------------------------------------------
    数据库优化
    数据库教程
    数据库实战经验分享博客

    百度云下载

    评测


  • 相关阅读:
    一个方法只做一件事
    日常-生活-学习-经验分享
    Python 用下划线作为变量前缀和后缀指定特殊变量
    浏览器渲染的基本原理
    七个对我最好的职业建议
    web性能优化
    Javascript 设计模式
    数据结构与算法 Javascript描述
    mysql计算连续天数,mysql连续登录天数,连续天数统计
    Oracle计算连续天数,计算连续时间,Oracle连续天数统计
  • 原文地址:https://www.cnblogs.com/longle/p/2914365.html
Copyright © 2011-2022 走看看