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);
}
}
我不理解的是return Foo(i -1) + Foo(i - 2);这句,写一个我知道,但是它两个函数相加我就不明白了,总的来说还是我没有理解递归的原理吧!哪位大神能详细跟我说说这两个函数是怎么相加的,执行原理是什么呢? 我调试了很多遍,依然看不出名堂。
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);
}
}
如你的代码所言,
如果
i=0,F0=0
i=1或2,F1=1,F2=1;
以上两行相当于给定初始值;
当i=3时,F3=F1+F2,而F1和F2需要调用函数F(i);
当i=4时,F4=F2+F3;而F2要调用F(),计算F3时要调用两层的F(),即先要调用F2和F1,然后F2和F1要调用F();
所以,i=n时就得递归调用很多次,其实递归函数有其优势,但是它很费资源和内存,一般不用它。
希望对你有用
Foo 把他的计算结果相加
不是函数相加,是函数的返回值相加,先执行Foo(i -1)返回一个int 数1,再执行Foo(i - 2)返回一个int 数2,然后是:数1+数2 作为返回结果 。
你应该注意这一句
if (i <= 0) return 0;
else if(i > 0 && i <= 2) return 1;
当i=1 i=2时,结果是1;当i=时,结果是0;这是递归的结束;当i确定时,结果就确定了,因为不停的Foo(i-1)+Foo(i-2)直到i=2 i=1 i=0;总是有个尽头的。
单独调试,一句一句的看执行顺序,能帮助你理解递归~
递归是逐级的调用,在函数结束的时候是从最后面往前反序的结束.这种方式是很占用资源,也很费时的。但是有的时候使用递归写出来的程序很容易理解,很易读.
首先赞扬下楼主的学习精神,半夜了都!
举个例子应该是最好理解的:
1.假如求Foo(4)=?,调用后,则变为Foo(4)=Foo(3)+Foo(2),这个时候,就会去求Foo(3)和Foo(2)的值了,求得后再相加就返回了。
2.Foo(3)=Foo(2)+Foo(1) ,此时再求F2和F1的值。 //2,3步骤求F3的值
3.F2直接return1;F1直接return1;所以F3=2了。
4.这时候,再求另一部分的值F2,函数直接返回1。 //因为F4=F3+F2,前两步F3求得了,此处求F2。
5.这个时候,F4=2+1=3;
其实,就是一个压栈出栈的操作。这个函数是Fibonacci数列的一个函数了,递归的最简单例子。
可以发现,代码简洁,性能是差的,存在重复计算。如例子中的F2就计算了两次。
递归缺点:栈太深时容易溢出,效率低; 对策:可以把上述函数改为一个非递归。
优点:代码清晰,简洁。
感谢您详细的解释,我有些懂了.
不错,不错,学习了。
递归缺点:栈太深时容易溢出。这一点不是很理解,能不能解释一下溢出是怎么回事呢。
谢谢!!!
@度一工作室: 百度到一个,你参考下:http://zhidao.baidu.com/question/266296531.html
函数调用自身,就是递归 。