使用斐波那契级数的递归函数 我是自学自C++的,一天一小时自学C++,第150页用Fibonacci数列讨论递归函数。

使用斐波那契级数的递归函数 我是自学自C++的,一天一小时自学C++,第150页用Fibonacci数列讨论递归函数。,c++,recursion,fibonacci,C++,Recursion,Fibonacci,他使用以下代码: #include <iostream> using namespace std; int GetFibNumber(int FibIndex) { if(FibIndex < 2 ) return FibIndex; else return GetFibNumber(FibIndex - 1) + GetFibNumber(FibIndex - 2); } int main() { cout <

他使用以下代码:

#include <iostream>
using namespace std;

int GetFibNumber(int FibIndex)
{
    if(FibIndex < 2 )
        return FibIndex;
    else
        return GetFibNumber(FibIndex - 1) + GetFibNumber(FibIndex - 2);
}

int main()
{
    cout << " Enter 0 based index of desired Fibonacci Number: ";
    int Index = 0;
    cin >> Index;

    cout << " Fibonacci number is: " << GetFibNumber(Index) << endl;

    return 0;

}
#包括
使用名称空间std;
int GetFibNumber(int FibIndex)
{
如果(指数<2)
收益率指数;
其他的
返回GetFibNumber(FibIndex-1)+GetFibNumber(FibIndex-2);
}
int main()
{
cout>指数;

cout使用不使用递归的版本是不正确的。它将只正确计算前几个Fibonacci数。尝试使用这两个版本计算前10个Fibonacci数,您将看到这两个版本计算两个不同的序列。

使用不使用递归的版本是不正确的。它将仅正确计算前几个Fibonacci数。尝试使用这两个版本计算前10个Fibonacci数,您将看到这两个版本计算了两个不同的序列。

函数
getFibonacci
计算Fibonacci数列中的第n个数。如果您只是看一下,它的解释就是Calculation通过在Fibonacci数列中添加第n-1和第n-2个数字来实现。这正是函数所做的。在Fibonacci数列中为函数提供一个要计算的索引(假设为6;结果应该是8)

要计算斐波那契数列中的第6个元素,需要将第5个和第4个元素相加。因此,首先需要计算这些元素。这就是递归的步骤。您可以让函数调用自己;但现在使用5和4,而不是使用值6作为参数再次调用它。这将再次导致相同的问题(您需要通过添加元素4和3来计算第5个元素),等等


使用递归函数,您可以简单地重复使用代码一遍又一遍地执行相同的计算,直到达到某一点,在该点上您可以得到计算的答案(在这种情况下,如果N=1或N=0;这些情况将导致1).

函数
getFibonacci
计算Fibonacci数列中的第n个数。如果您只是看一下,它的解释是通过将Fibonacci数列中的第n-1和第n-2个数相加来计算的。这正是函数所做的。您为函数提供了一个Fibonacci数列中要计算的索引计算(比如说6;结果应该是8)

要计算斐波那契数列中的第6个元素,需要将第5个和第4个元素相加。因此,首先需要计算这些元素。这就是递归的步骤。您可以让函数调用自己;但现在使用5和4,而不是使用值6作为参数再次调用它。这将再次导致相同的问题(您需要通过添加元素4和3来计算第5个元素),等等


使用递归函数,您可以简单地重复使用代码一遍又一遍地执行相同的计算,直到达到某一点,在该点上您可以得到计算的答案(在本例中,如果N=1或N=0,这些情况将导致1)。

由于您仍在学习,我建议您以递归方式对这两种情况进行编程(就像作者所做的)并使用循环(while,for)。它很可能会向您展示如何构建此算法的答案

提示1:您必须知道Fibonnaci序列是建立在两个初始值上的


提示2:当涉及递归时,您应该知道函数结果是如何存储的。这也将解释您的问题。

由于您仍在学习,我建议您以递归方式(如作者所做)和使用循环(例如while)编程它很可能会告诉你这个算法是如何建立的

提示1:您必须知道Fibonnaci序列是建立在两个初始值上的

提示2:当涉及到递归时,您应该知道函数结果是如何存储的。这也将解释您的问题。

您会问:“为什么必须在函数本身内部调用函数?”严格来说,您不会

是由该数学递归定义的数字序列:

  • a0=0
  • a1=1
  • an=an-1+an-2
原始函数确实计算了这个序列,但效率很低。如果
Index
为0,则返回0;如果为1,则返回1。否则,将返回
GetFibNumber(Index-1)+GetFibNumber(Index-2)
,这正是数学定义。对于序列的每个元素,必须在序列中添加前两个术语

您的代码只返回
索引-1+索引-2
,这将给出不同的数字序列。比较:

  • 斐波那契:0,1,1,2,3,5,8,13,21,36
  • 你的:0,1,1,3,5,7,9,11,13,17
但除此之外,您不需要严格地使用递归函数来计算这个数学递归。您只需要一个简单的
for
循环:

int GetFibNumber(int FibIndex)
{

    if(FibIndex < 2 )
        return FibIndex;

    int a_n_2 = 0, a_n_1 = 1, a_n;

    for (i = 2; i < FibIndex; i++)
    {
        a_n = a_n_1 + a_n_2;
        a_n_2 = a_n_1;
        a_n_1 = a_n;
    }

    return a_n;
}
int-GetFibNumber(int-FibIndex)
{
如果(指数<2)
收益率指数;
int a_n_2=0,a_n_1=1,a_n;
对于(i=2;i
这种方法也会更快

<> >代码递归技术在数学上是正确的。但是,它是慢的,因为它不重用任何计算。它通过将递归重算回到A1来计算AN-1。然后计算AN-2,而不重用生成AN-1的任何工作。如果你认为这种重复使用的不足发生在递归的每一步。在上,您将看到它在
for
循环中线性增长


高级主题:有一种方法可以使递归版本运行得更快,了解您是否遇到了
        Fib(8)
        /    \
    Fib(7)   Fib(6)
                 Fib(8)
               /        \
          Fib(7)       Fib(6)
        /        \    /      \
     Fib(5)   Fib(6) Fib(5)  Fib(4)
    Fib(8)
    /    \
   7      6