首页 新闻 赞助 找找看

一直没有理解的递归算法,望大神解释一下

0
悬赏园豆:5 [已解决问题] 解决于 2014-05-17 18:47

 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);这句,写一个我知道,但是它两个函数相加我就不明白了,总的来说还是我没有理解递归的原理吧!哪位大神能详细跟我说说这两个函数是怎么相加的,执行原理是什么呢? 我调试了很多遍,依然看不出名堂。

futurer的主页 futurer | 初学一级 | 园豆:103
提问于:2013-07-26 02:32
< >
分享
最佳答案
0

 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时就得递归调用很多次,其实递归函数有其优势,但是它很费资源和内存,一般不用它。

希望对你有用

收获园豆:5
ZGHAPPY | 菜鸟二级 |园豆:207 | 2013-12-12 11:20
其他回答(8)
0

Foo 把他的计算结果相加

Tom.汤 | 园豆:3026 (老鸟四级) | 2013-07-26 08:28
0

不是函数相加,是函数的返回值相加,先执行Foo(i -1)返回一个int 数1,再执行Foo(i - 2)返回一个int 数2,然后是:数1+数2 作为返回结果 。

Survival.Sun | 园豆:267 (菜鸟二级) | 2013-07-26 08:28
0

你应该注意这一句

 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;总是有个尽头的。

panjk | 园豆:712 (小虾三级) | 2013-07-26 08:46
0

单独调试,一句一句的看执行顺序,能帮助你理解递归~

幻天芒 | 园豆:37175 (高人七级) | 2013-07-26 09:38
0

递归是逐级的调用,在函数结束的时候是从最后面往前反序的结束.这种方式是很占用资源,也很费时的。但是有的时候使用递归写出来的程序很容易理解,很易读.

db丶 | 园豆:195 (初学一级) | 2013-07-26 09:41
1

首先赞扬下楼主的学习精神,半夜了都!

举个例子应该是最好理解的:

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就计算了两次。

递归缺点:栈太深时容易溢出,效率低;    对策:可以把上述函数改为一个非递归。

优点:代码清晰,简洁。

在大地画满窗子 | 园豆:102 (初学一级) | 2013-07-26 13:50

感谢您详细的解释,我有些懂了.

支持(0) 反对(0) futurer | 园豆:103 (初学一级) | 2013-07-26 17:02

不错,不错,学习了。

递归缺点:栈太深时容易溢出。这一点不是很理解,能不能解释一下溢出是怎么回事呢。

谢谢!!!

支持(0) 反对(0) 度一 | 园豆:226 (菜鸟二级) | 2013-07-27 14:22

@度一工作室: 百度到一个,你参考下:http://zhidao.baidu.com/question/266296531.html

支持(0) 反对(0) 在大地画满窗子 | 园豆:102 (初学一级) | 2013-07-29 10:49
0

函数调用自身,就是递归 。

dotnetgeek | 园豆:482 (菜鸟二级) | 2013-07-26 13:56
0

路过,帮顶 @在大地画满窗子 回答的比较好

clarlespeng | 园豆:469 (菜鸟二级) | 2013-07-26 14:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册