首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何返回值?-递归算法

如何返回值?-递归算法
EN

Stack Overflow用户
提问于 2017-05-16 17:53:04
回答 4查看 264关注 0票数 5

我的头脑无法理解这个简单的递归算法是如何返回值的。该算法如下:

代码语言:javascript
复制
int fib(int n)
{
     if (n <= 1)
         return n;

     return fib(n-1) + fib(n-2);

}

,我想知道如何将5输入到这个函数中,返回5?,我知道第五个斐波那契数是5,所以这是正确的答案,但我不确定这个答案是如何从上面的代码中导出的。前五个斐波那契数:1,2,3,5.

据我有限的理解,我认为把5传递给这个函数会返回7。这是因为5-1 =4和5-2= 3。然后把这两个数字相加,我得到了简单的整数7。这有意义吗?我相信我已经失去了一个人读这个,虽然这是非常简单的。如果我读了这篇文章,我会迷路的。

另外,如果我创建一个递归树,并从5开始显示对fib的递归调用,我不知道它最终是如何返回5的,但我确实看到了对函数fib()的所有调用,直到最终返回1为止,因为对fib()的参数是0或1。我绘制的递归树只是这个页面中显示的一个副本。

一个人能帮助我理解这个递归算法吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-05-16 17:58:09

好的,让我们打开fib(5)的递归

代码语言:javascript
复制
fib(5) = fib(4) + fib(3)
fib(4) = fib(3) + fib(2)
fib(3) = fib(2) + fib(1)
fib(2) = fib(1) + fib(0)
fib(1) = 1
fib(0) = 0

fib(1) + fib(0) = 1 + 0 = 1 so fib(2) = 1
fib(2) + fib(1) = 1 + 1 = 2 so fib(3) = 2
fib(3) + fib(2) = 2 + 1 = 3 so fib(4) = 3
fib(4) + fib(3) = 3 + 2 = 5 so fib(5) = 5

您是对的,5-1 =4和5-2 = 3,但这只意味着您正在调用fib(4) + fib(3) = 5,这与4 + 3 = 7非常不同。

票数 7
EN

Stack Overflow用户

发布于 2017-05-16 18:18:50

下面是递归调用树的版本:

代码语言:javascript
复制
fib(5) = fib(4)                                     + fib(3)

         |                                            |
         +--------------------------\                 +-----------------\
         |                          |                 |                 |

       = fib(3)                   + fib(2)          + fib(2)          + fib(1)

         |                          |                 |                 |
         +-----------------\        +--------\        +--------\        |
         |                 |        |        |        |        |        |

       = fib(2)          + fib(1) + fib(1) + fib(0) + fib(1) + fib(0) + 1

         |                 |        |        |        |        |        |
         +--------\        |        |        |        |        |        |
         |        |        |        |        |        |        |        |

       = fib(1) + fib(0) + 1      + 1      + 0      + 1      + 0      + 1

         |        |        |        |        |        |        |        |
         |        |        |        |        |        |        |        |
         |        |        |        |        |        |        |        |

       = 1      + 0      + 1      + 1      + 0      + 1      + 0      + 1

       = 5
票数 5
EN

Stack Overflow用户

发布于 2017-05-16 17:56:43

将返回看作返回一个数字,为了得到这个数字,它必须调用一个函数并运行该函数。它这样做,直到达到一个基本情况,n=0或1,然后它不会调用另一个函数来返回一个数字。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44008382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档