编写尾部递归函数以计算第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)