📜  斐波那契的尾递归

📅  最后修改于: 2021-04-26 18:42:35             🧑  作者: Mango

编写尾部递归函数以计算第n个斐波那契数。
例子 :

Input : n = 4
Output : fib(4) = 3

Input : n = 9
Output : fib(9) = 34

先决条件:尾递归,斐波那契数
当递归调用是该函数执行的最后一件事时,递归函数就是尾部递归。

编写尾部递归有点棘手。为了获得正确的直觉,我们首先来看计算第n个斐波纳契数的迭代方法。

int fib(int n)
{
  int a = 0, b = 1, c, i;
  if (n == 0)
    return a;
  for (i = 2; i <= n; i++)
  {
     c = a + b;
     a = b;
     b = c;
  }
  return b;
}

这里有三种与n有关的可能性:

n == 0
n == 1
n > 1

前两个是微不足道的。我们重点讨论n> 1时的情况。
在我们的n> 1的迭代方法中
我们从

a = 0
b = 1

对于n-1次,我们对有序对(a,b)重复以下操作
尽管我们在实际的迭代方法中使用了c,但是主要目标如下:-

(a, b) = (b, a+b)

在n-1次迭代之后,我们最终返回b。
因此,这次我们用递归方法重复同样的事情。我们设置默认值

a = 0
b = 1

在这里,我们将递归地调用相同的函数n-1次,并相应地更改a和b的值。
最后,返回b。
如果它的情况为n == 0或n == 1,我们不必担心!
这是尾递归斐波那契代码的实现。

C++
// Tail Recursive Fibonacci
// implementation
#include 
using namespace std;
 
// A tail recursive function to
// calculate n th fibnacci number
int fib(int n, int a = 0, int b = 1)
{
    if (n == 0)
        return a;
    if (n == 1)
        return b;
    return fib(n - 1, b, a + b);
}
 
// Driver Code
int main()
{
    int n = 9;
    cout << "fib(" << n << ") = "
         << fib(n) << endl;
    return 0;
}


Java
// Tail Recursive
// Fibonacci implementation
 
class GFG
{
    // A tail recursive function to
    // calculate n th fibnacci number
    static int fib(int n, int a, int b )
    {
         
        if (n == 0)
            return a;
        if (n == 1)
            return b;
        return fib(n - 1, b, a + b);
    }
     
    public static void main (String[] args)
    {
        int n = 9;
        System.out.println("fib(" + n +") = "+
                                 fib(n,0,1) );
    }
}


Python
# A tail recursive function to
# calculate n th fibnacci number
def fib(n, a = 0, b = 1):
    if n == 0:
        return a
    if n == 1:
        return b
    return fib(n - 1, b, a + b);
 
# Driver Code
n = 9;
print("fib("+str(n)+") = "+str(fib(n)))


C#
// C# Program for Tail
// Recursive Fibonacci
using System;
 
class GFG
{
     
    // A tail recursive function to
    // calculate n th fibnacci number
    static int fib(int n, int a , int b )
    {
        if (n == 0)
            return a;
        if (n == 1)
            return b;
        return fib(n - 1, b, a + b);
    }
     
    // Driver Code
    public static void Main ()
    {
        int n = 9;
        Console.Write("fib(" + n +") = " +
                           fib(n, 0, 1) );
    }
}
 
// This code is contributed
// by nitin mittal.


PHP


C++
#include 
using namespace std;
 
int main() {
 
    cout<<"GFG!";
    return 0;
}


Javascript


输出 :

fib(9) = 34

算法分析

Time Complexity: O(n)
Auxiliary Space : O(n)