(C#)递归解说

来源:百度知道 编辑:UC知道 时间:2024/06/07 21:10:49
一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现。
答:public class MainClass
{
public static void Main()
{
Console.WriteLine(Foo(30));
}
public static int Foo(int i)
{
if (i <= 0)
return 0;
else if(i > 0 && i <= 2)
return 1;
else return Foo(i -1) + Foo(i - 2);
}
}
请高手赐教!把程序流程进逐一的阐述。
特别是else return Foo(i -1) + Foo(i - 2); 这一段请详细解释。
完善回答高分答谢!
我需要知道的是else return Foo(i -1) + Foo(i - 2);
当程序运行到 Foo(i-1) 是不是调用了Foo方法传入一个减一的值再运行程序本身呢?然后把值得出来再加上Foo(i -2)的结果 再Return呢?

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 ......

其实可以这样写
public static int Foo(int i)
{
if (i <= 0) return 0; /传入0为0
if(i <= 2) return 1; /传入1或2都为1
return Foo(i -1) + Foo(i - 2);
}
详解