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