代码改变世界

递归算法

2010-06-25 18:06  CuiWenKe  阅读(257)  评论(0编辑  收藏  举报

public static int Foo(int i)
{
if (i <= 0)
return 0; // 小于0 的返回0
else if(i > 0 && i <= 2)
return 1; // 前两位数都是1
else return Foo(i -1) + Foo(i - 2); // 从第三位数开始
等于前两位的和,如果i-1位数是第一位或者第二位数就返回1 如果不是继续返回为前两位的和一直到是1为止,然后依次将其后的一个数算出来,最终算到你设置的地方 第30个数字。

我的理解是 调用这个方法运算到这的时候如果需要递归,就再次调用自己,其实你最初调用的方法就一直停在了 else return Foo(i -1) + Foo(i - 2);
这个位置,新调用的方法也是这么算 如果到了这里else return Foo(i -1) + Foo(i - 2); 也是停在这继续再调用这个方法,知道不再调用了,再一步步的返回一个值,直到你第一次调用的地方,就把你要的值求出来了

递归嘛,可以看做第一次到这就停了,这个数再用这个方法去算,一层层的算下去直到出来数字1就是这个方法到不了这,而是直接返回一个数的时候,在一层层的倒退算回去,最终就算到你第一次调用的时候了,也就是30的时候
}
}
i30=i29+i28
i29=i28+i27  i28=i27+i26
i28=i27+i26  i27=i26+i25  i27=i26+i25  i26=i25+i24
....
.....
......
i3=i2+i1=1+1=2 ......

 

-_-~ 斐布那契数列?? 不知道字对不对

了解这个数列就知道

i=1  x1=1
i=2  x2=1
i=3  x3=x1+x2
i=4  x4=x2+x3
....
i=n xn=x(n-1)+x(n-2)
数列的模式就是这样了

换句话来说,第N个值是它前两个值的和

Foo(int i) 求i=n时的值,简写Foo(n)
它的结果为 Foo(n) = Foo(n-1)+Foo(n-2)
同理
Foo(n-1) = Foo(n-2)+Foo(n-3)
Foo(n-2) = Foo(n-3)+Foo(n-4)

通理解嘛...

 

        #region 递归搜索目录,历遍文件
        /// <summary>
        /// 递归搜索目录,历遍文件
        /// </summary>
        /// <param name="sDir">目录名</param>
        void DirSearch(string sDir)
        {
            try
            {
                foreach (string d in Directory.GetDirectories(sDir))
                {
                    foreach (string f in Directory.GetFiles(d))
                    {
                        FileInfo fi = new FileInfo(f);
                        FileCheck(fi); //如果是文件,执行FileCheck
                    }
                    DirSearch(d); //递归查询
                }
            }
            catch (System.Exception excpt)
            {
                MessageBox.Show(excpt.Message);
            }
        }
        #endregion

 

 #region  递归绑定树控件
        private void CreateTree()
        {
            NavList = riskType.GetListRisksType();
            if (NavList != null)
            {
                if (NavList.Count >= 1)
                {
                    this.TreeViewRiskType.Nodes.Clear();
                }
                foreach (Models.CfgRiskBasicType model in NavList.Where(p => p.typeDispOrder == 1))
                {
                    TreeNode ParentNode = new TreeNode(model.riskBasicTypeName, model.cfgRiskBasicTypeID.ToString()+","+model.parentTypeID.ToString().Trim()+","+ model.typeDispOrder.ToString().Trim());
                    TreeViewRiskType.Nodes.Add(ParentNode);
                    GetChildNodes(ParentNode);
                }

                this.TreeViewRiskType.ExpandAll();
               
            }
           
        }

        private void GetChildNodes(TreeNode ParentNode)
        {
            string [] strBytes  = ParentNode.Value.Trim().Split(',');
            Guid _cfgRiskBasicTypeID = new Guid(strBytes[0].Trim());

            foreach (Models.CfgRiskBasicType model in NavList.Where(p => p.parentTypeID == _cfgRiskBasicTypeID))
            {
                TreeNode ChildNode = new TreeNode(model.riskBasicTypeName, model.cfgRiskBasicTypeID.ToString()+","+model.parentTypeID.ToString().Trim()+","+model.typeDispOrder.ToString().Trim());
                //if (NavList.Exists(p => p.typeDispOrder == model.typeDispOrder)) GetChildNodes(ChildNode);
                
                if (NavList.Exists(p => p.cfgRiskBasicTypeID == model.parentTypeID)) GetChildNodes(ChildNode);
                ParentNode.ChildNodes.Add(ChildNode);
            }
        }
        #endregion