برنامه محاسبه nامین عدد فیبوناچی — به زبان ساده

۹۶۴۰ بازدید
آخرین به‌روزرسانی: ۲۱ تیر ۱۴۰۲
زمان مطالعه: ۱۷ دقیقه
برنامه محاسبه nامین عدد فیبوناچی — به زبان ساده

در این مطلب، روش‌های گوناگون نوشتن برنامه محاسبه nامین عدد فیبوناچی مورد بررسی قرار گرفته و سپس، پیاده‌سازی آن در زبان‌های برنامه‌نویسی گوناگون شامل ++C، «جاوا» (Java)، «پایتون» (Python)، «سی‌شارپ» (#C) و «پی‌اچ‌پی» (PHP) انجام شده است. اعداد فیبوناچی، اعدادی هستند که در توالی اعداد صحیح زیر قرار داشته باشند.

فهرست مطالب این نوشته

۰, ۱, ۱, ۲, ۳, ۵, ۸, ۱۳, ۲۱, ۳۴, ۵۵, ۸۹, ۱۴۴, ...

به بیان ریاضی، توالی Fn از اعداد فیبوناچی با استفاده از رابطه بازگشتی زیر، تعریف شده است.

Fn = Fn-1 + Fn-2

در رابطه بالا، مقدار دانه برای F0 = 0 و برای F1 = 1 است.

F0 = 0 and F1 = 1

برنامه محاسبه nامین عدد فیبوناچی

فرض می‌شود عدد n داده شده است. هدف، نوشتن برنامه‌ای است که n‌اُمین عدد فیبوناچی را چاپ کند. مثال‌های زیر در این راستا قابل توجه هستند.

Input: n = ۲

Output: ۱



Input: n = ۱

Output: ۳۴

در ادامه، تابع (int fib(int n نوشته می‌شود که مقدار Fn را باز می‌گرداند. برای مثال، اگر n = 0 باشد، ()fib باید ۰ و اگر n = 1 باشد، تابع ()fib باید مقدار ۱ را بازگرداند. برای n > 1، باید مقدار Fn-1 + Fn-2 بازگردانده شود.

For n = 9

Output: ۳۴

در ادامه، روش‌های گوناگون محاسبه nامین عدد فیبوناچی ارائه شده است.

روش اول محاسبه nامین عدد فیبوناچی

یک راهکار ساده برای محاسبه nامین عدد فیبوناچی، پیاده‌سازی مستقیم رابطه ریاضی بازگشتی است که پیش‌تر ارائه شد.

برنامه بازگشتی محاسبه nامین عدد فیبوناچی در ++C

1//Fibonacci Series using Recursion 
2#include<bits/stdc++.h> 
3using namespace std; 
4  
5int fib(int n) 
6{ 
7    if (n <= 1) 
8        return n; 
9    return fib(n-1) + fib(n-2); 
10} 
11  
12int main () 
13{ 
14    int n = 9; 
15    cout << fib(n); 
16    getchar(); 
17    return 0; 
18} 
19  
20// This code is contributed 
21// by Akanksha Rai 

برنامه بازگشتی محاسبه nامین عدد فیبوناچی در C

1//Fibonacci Series using Recursion 
2#include<stdio.h> 
3int fib(int n) 
4{ 
5   if (n <= 1) 
6      return n; 
7   return fib(n-1) + fib(n-2); 
8} 
9  
10int main () 
11{ 
12  int n = 9; 
13  printf("%d", fib(n)); 
14  getchar(); 
15  return 0; 
16} 

برنامه بازگشتی محاسبه nامین عدد فیبوناچی در جاوا

1//Fibonacci Series using Recursion 
2class fibonacci 
3{ 
4    static int fib(int n) 
5    { 
6    if (n <= 1) 
7       return n; 
8    return fib(n-1) + fib(n-2); 
9    } 
10       
11    public static void main (String args[]) 
12    { 
13    int n = 9; 
14    System.out.println(fib(n)); 
15    } 
16} 
17/* This code is contributed by Rajat Mishra */

برنامه بازگشتی محاسبه nامین عدد فیبوناچی در پایتون

1# Function for nth Fibonacci number 
2  
3def Fibonacci(n): 
4    if n<0: 
5        print("Incorrect input") 
6    # First Fibonacci number is 0 
7    elif n==0: 
8        return 0
9    # Second Fibonacci number is 1 
10    elif n==1: 
11        return 1
12    else: 
13        return Fibonacci(n-1)+Fibonacci(n-2) 
14  
15# Driver Program 
16  
17print(Fibonacci(9)) 
18  
19#This code is contributed by Saket Modi

برنامه بازگشتی محاسبه nامین عدد فیبوناچی در #C

1// C# program for Fibonacci Series  
2// using Recursion 
3using System;  
4  
5public class GFG  
6{  
7    public static int Fib(int n)  
8    {  
9        if (n <= 1)  
10        {  
11            return n;  
12        }  
13        else
14        {  
15            return Fib(n - 1) + Fib(n - 2);  
16        }  
17    }  
18          
19    // driver code 
20    public static void Main(string[] args)  
21    {  
22        int n = 9; 
23        Console.Write(Fib(n));  
24    }  
25}  
26  
27// This code is contributed by Sam007

برنامه بازگشتی محاسبه nامین عدد فیبوناچی در PHP

1<?php 
2// Fibonacci Series  
3// using Recursion 
4  
5// function returns  
6// the Fibonacci number 
7function fib($n) 
8{ 
9    if ($n <= 1) 
10        return $n; 
11    return fib($n - 1) +  
12           fib($n - 2); 
13} 
14  
15// Driver Code 
16$n = 9; 
17echo fib($n); 
18  
19// This code is contributed by aj_36 
20?> 

خروجی

خروجی قطعه کدهای بالا برای n = 9 به صورت زیر است.

34

پیچیدگی زمانی این این روش، (T(n) = T(n-1) + T(n-2 است. می‌توان مشاهده کرد که این پیاده‌سازی کارهای تکرار شونده زیادی را انجام می دهد (درخت بازگشتی که در ادامه آمده، قابل مشاهده است). بنابراین، پیاده‌سازی ارائه شده در بالا، برای محاسبه nامین عدد فیبوناچی، نامناسب است.

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)
/ \
fib(1) fib(0)

فضای اضافی (Extra Space) مورد استفاده در روش بالا، اگر فراخوانی تابع برابر با سایز پشته در نظر گرفته شود، برابر با (O(n و در غیر این صورت برابر با (O(۱ است.

روش دوم محاسبه nامین عدد فیبوناچی

در روش دوم محاسبه nامین عدد فیبوناچی، از روش بازگشتی، همراه با برنامه‌نویسی پویا (Dynamic Programming) استفاده شده است. در این روش، می‌توان از کار تکرار شونده‌ای که در راهکار بالا انجام می‌شود اجتناب کرد؛ این کار به وسیله ذخیره‌سازی اعداد فیبوناچی که تاکنون محاسبه شده‌اند انجام می‌شود.

برنامه محاسبه nامین عدد فیبوناچی در C

1//Fibonacci Series using Dynamic Programming 
2#include<stdio.h> 
3  
4int fib(int n) 
5{ 
6  /* Declare an array to store Fibonacci numbers. */
7  int f[n+2];   // 1 extra to handle case, n = 0 
8  int i; 
9  
10  /* 0th and 1st number of the series are 0 and 1*/
11  f[0] = 0; 
12  f[1] = 1; 
13  
14  for (i = 2; i <= n; i++) 
15  { 
16      /* Add the previous 2 numbers in the series 
17         and store it */
18      f[i] = f[i-1] + f[i-2]; 
19  } 
20  
21  return f[n]; 
22} 
23  
24int main () 
25{ 
26  int n = 9; 
27  printf("%d", fib(n)); 
28  getchar(); 
29  return 0; 
30}

برنامه محاسبه nامین عدد فیبوناچی در جاوا

1// Fibonacci Series using Dynamic Programming 
2class fibonacci 
3{ 
4   static int fib(int n) 
5    { 
6    /* Declare an array to store Fibonacci numbers. */
7    int f[] = new int[n+2]; // 1 extra to handle case, n = 0 
8    int i; 
9       
10    /* 0th and 1st number of the series are 0 and 1*/
11    f[0] = 0; 
12    f[1] = 1; 
13      
14    for (i = 2; i <= n; i++) 
15    { 
16       /* Add the previous 2 numbers in the series 
17         and store it */
18        f[i] = f[i-1] + f[i-2]; 
19    } 
20       
21    return f[n]; 
22    } 
23       
24    public static void main (String args[]) 
25    { 
26        int n = 9; 
27        System.out.println(fib(n)); 
28    } 
29} 
30/* This code is contributed by Rajat Mishra */

برنامه محاسبه nامین عدد فیبوناچی در پایتون

1# Fibonacci Series using Dynamic Programming  
2def fibonacci(n):  
3      
4    # Taking 1st two fibonacci nubers as 0 and 1  
5    FibArray = [0, 1]  
6      
7    while len(FibArray) < n + 1:  
8        FibArray.append(0)  
9      
10    if n <= 1:  
11        return n  
12    else:  
13        if FibArray[n - 1] == 0:  
14            FibArray[n - 1] = fibonacci(n - 1)  
15  
16        if FibArray[n - 2] == 0:  
17            FibArray[n - 2] = fibonacci(n - 2)  
18              
19    FibArray[n] = FibArray[n - 2] + FibArray[n - 1]  
20    return FibArray[n]  
21      
22print(fibonacci(9))

برنامه محاسبه nامین عدد فیبوناچی در #C

1// C# program for Fibonacci Series  
2// using Dynamic Programming 
3using System; 
4class fibonacci { 
5      
6static int fib(int n) 
7    { 
8          
9        // Declare an array to  
10        // store Fibonacci numbers. 
11        // 1 extra to handle  
12        // case, n = 0 
13        int []f = new int[n + 2];  
14        int i; 
15          
16        /* 0th and 1st number of the  
17           series are 0 and 1 */
18        f[0] = 0; 
19        f[1] = 1; 
20          
21        for (i = 2; i <= n; i++) 
22        { 
23            /* Add the previous 2 numbers 
24               in the series and store it */
25            f[i] = f[i - 1] + f[i - 2]; 
26        } 
27          
28        return f[n]; 
29    } 
30      
31    // Driver Code 
32    public static void Main () 
33    { 
34        int n = 9; 
35        Console.WriteLine(fib(n)); 
36    } 
37} 
38  
39// This code is contributed by anuj_67.

برنامه محاسبه nامین عدد فیبوناچی در PHP

1<?php 
2//Fibonacci Series using Dynamic 
3// Programming 
4  
5function fib( $n) 
6{ 
7      
8    /* Declare an array to store 
9    Fibonacci numbers. */
10      
11    // 1 extra to handle case, 
12    // n = 0 
13    $f = array(); 
14    $i; 
15      
16    /* 0th and 1st number of the 
17    series are 0 and 1*/
18    $f[0] = 0; 
19    $f[1] = 1; 
20      
21    for ($i = 2; $i <= $n; $i++) 
22    { 
23          
24        /* Add the previous 2 
25        numbers in the series 
26        and store it */
27        $f[$i] = $f[$i-1] + $f[$i-2]; 
28    } 
29      
30    return $f[$n]; 
31} 
32  
33$n = 9; 
34echo fib($n); 
35  
36// This code is contributed by 
37// anuj_67.  
38?> 

روش سوم محاسبه nامین عدد فیبوناچی

این روش، نسبت به روش‌های ارائه شده در بالا، بهینه‌تر است. در اینجا، می‌توان فضای استفاده شده در روش ۲ را با ذخیره‌سازی دو عدد پیشین بهینه کرد. زیرا این دو مورد، تنها اعدادی هستند که برای محاسبه عدد فیبوناچی بعدی در سری مورد نیاز هستند.

برنامه محاسبه nامین عدد فیبوناچی در ++C/C

1// Fibonacci Series using Space Optimized Method 
2#include<stdio.h> 
3int fib(int n) 
4{ 
5  int a = 0, b = 1, c, i; 
6  if( n == 0) 
7    return a; 
8  for (i = 2; i <= n; i++) 
9  { 
10     c = a + b; 
11     a = b; 
12     b = c; 
13  } 
14  return b; 
15} 
16  
17int main () 
18{ 
19  int n = 9; 
20  printf("%d", fib(n)); 
21  getchar(); 
22  return 0; 
23}

برنامه محاسبه nامین عدد فیبوناچی در جاوا

1// Java program for Fibonacci Series using Space 
2// Optimized Method 
3class fibonacci 
4{ 
5    static int fib(int n) 
6    { 
7        int a = 0, b = 1, c; 
8        if (n == 0) 
9            return a; 
10        for (int i = 2; i <= n; i++) 
11        { 
12            c = a + b; 
13            a = b; 
14            b = c; 
15        } 
16        return b; 
17    } 
18  
19    public static void main (String args[]) 
20    { 
21        int n = 9; 
22        System.out.println(fib(n)); 
23    } 
24} 
25  
26// This code is contributed by Mihir Joshi

برنامه محاسبه nامین عدد فیبوناچی در پایتون

1# Function for nth fibonacci number - Space Optimisataion 
2# Taking 1st two fibonacci numbers as 0 and 1 
3  
4def fibonacci(n): 
5    a = 0
6    b = 1
7    if n < 0: 
8        print("Incorrect input") 
9    elif n == 0: 
10        return a 
11    elif n == 1: 
12        return b 
13    else: 
14        for i in range(2,n+1): 
15            c = a + b 
16            a = b 
17            b = c 
18        return b 
19  
20# Driver Program 
21  
22print(fibonacci(9)) 
23  
24#This code is contributed by Saket Modi

برنامه محاسبه nامین عدد فیبوناچی در #C

1// C# program for Fibonacci Series  
2// using Space Optimized Method 
3using System; 
4  
5namespace Fib  
6{  
7    public class GFG  
8    {  
9        static int Fib(int n)  
10        {  
11            int a = 0, b = 1, c = 0;  
12              
13            // To return the first Fibonacci number  
14            if (n == 0) return a;  
15      
16            for (int i = 2; i <= n; i++)  
17            {  
18                c = a + b;  
19                a = b;  
20                b = c;  
21            }  
22      
23            return b;  
24        }  
25          
26    // Driver function 
27    public static void Main(string[] args)  
28        {  
29              
30            int n = 9; 
31            Console.Write("{0} ", Fib(n));  
32        }  
33    }  
34}  
35  
36// This code is contributed by Sam007.

برنامه محاسبه nامین عدد فیبوناچی در PHP

1<?php 
2// PHP program for Fibonacci Series  
3// using Space Optimized Method 
4  
5function fib( $n) 
6{ 
7    $a = 0;  
8    $b = 1;  
9    $c; 
10    $i; 
11    if( $n == 0) 
12        return $a; 
13    for($i = 2; $i <= $n; $i++) 
14    { 
15        $c = $a + $b; 
16        $a = $b; 
17        $b = $c; 
18    } 
19    return $b; 
20} 
21  
22// Driver Code 
23$n = 9; 
24echo fib($n); 
25  
26// This code is contributed by anuj_67. 
27?>

خروجی

خروجی قطعه کدهای بالا برای n = 9 به صورت زیر است.

34

پیچیدگی زمانی این الگوریتم از درجه (O(n و فضای اضافی آن از (O(1 است.

روش چهارم محاسبه nامین عدد فیبوناچی

در اینجا، از به توان رساندن ماتریس {{1,1},{1,0}} برای محاسبه nامین عدد فیبوناچی استفاده شده است. پیچیدگی زمانی این راهکار از درجه (O(n است؛ دلیل این امر آن است که اگر n بار ماتریس {{M = {{1,1},{1,0 در خودش ضرب شود، (به بیان دیگر، توان (M, n) محاسبه شود) n+1اُمین عدد فیبوناچی به عنوان عنصری در سطر و ستون (0, 0) در ماتریس نتیجه به دست می‌آید. ارائه ماتریس، عبارت بسته زیر را برای اعداد فیبوناچی به دست می‌دهد.

$$\begin{bmatrix}1 & 1 \\1 & 0 \end{bmatrix} ^ n = \begin{bmatrix}F_{n+1} & F_{n} \\F_{n} & F_{n-1} \end{bmatrix}$$

برنامه محاسبه nامین عدد فیبوناچی در C

1#include <stdio.h> 
2  
3/* Helper function that multiplies 2 matrices F and M of size 2*2, and 
4  puts the multiplication result back to F[][] */
5void multiply(int F[2][2], int M[2][2]); 
6  
7/* Helper function that calculates F[][] raise to the power n and puts the 
8  result in F[][] 
9  Note that this function is designed only for fib() and won't work as general 
10  power function */
11void power(int F[2][2], int n); 
12  
13int fib(int n) 
14{ 
15  int F[2][2] = {{1,1},{1,0}}; 
16  if (n == 0) 
17      return 0; 
18  power(F, n-1); 
19  
20  return F[0][0]; 
21} 
22  
23void multiply(int F[2][2], int M[2][2]) 
24{ 
25  int x =  F[0][0]*M[0][0] + F[0][1]*M[1][0]; 
26  int y =  F[0][0]*M[0][1] + F[0][1]*M[1][1]; 
27  int z =  F[1][0]*M[0][0] + F[1][1]*M[1][0]; 
28  int w =  F[1][0]*M[0][1] + F[1][1]*M[1][1]; 
29  
30  F[0][0] = x; 
31  F[0][1] = y; 
32  F[1][0] = z; 
33  F[1][1] = w; 
34} 
35  
36void power(int F[2][2], int n) 
37{ 
38  int i; 
39  int M[2][2] = {{1,1},{1,0}}; 
40  
41  // n - 1 times multiply the matrix to {{1,0},{0,1}} 
42  for (i = 2; i <= n; i++) 
43      multiply(F, M); 
44} 
45  
46/* Driver program to test above function */
47int main() 
48{ 
49  int n = 9; 
50  printf("%d", fib(n)); 
51  getchar(); 
52  return 0; 
53}

برنامه محاسبه nامین عدد فیبوناچی در جاوا

1class fibonacci 
2{ 
3      
4    static int fib(int n) 
5    { 
6    int F[][] = new int[][]{{1,1},{1,0}}; 
7    if (n == 0) 
8        return 0; 
9    power(F, n-1); 
10      
11       return F[0][0]; 
12    } 
13       
14     /* Helper function that multiplies 2 matrices F and M of size 2*2, and 
15     puts the multiplication result back to F[][] */
16    static void multiply(int F[][], int M[][]) 
17    { 
18    int x =  F[0][0]*M[0][0] + F[0][1]*M[1][0]; 
19    int y =  F[0][0]*M[0][1] + F[0][1]*M[1][1]; 
20    int z =  F[1][0]*M[0][0] + F[1][1]*M[1][0]; 
21    int w =  F[1][0]*M[0][1] + F[1][1]*M[1][1]; 
22       
23    F[0][0] = x; 
24    F[0][1] = y; 
25    F[1][0] = z; 
26    F[1][1] = w; 
27    } 
28  
29    /* Helper function that calculates F[][] raise to the power n and puts the 
30    result in F[][] 
31    Note that this function is designed only for fib() and won't work as general 
32    power function */
33    static void power(int F[][], int n) 
34    { 
35    int i; 
36    int M[][] = new int[][]{{1,1},{1,0}}; 
37      
38    // n - 1 times multiply the matrix to {{1,0},{0,1}} 
39    for (i = 2; i <= n; i++) 
40        multiply(F, M); 
41    } 
42       
43    /* Driver program to test above function */
44    public static void main (String args[]) 
45    { 
46    int n = 9; 
47    System.out.println(fib(n)); 
48    } 
49} 
50/* This code is contributed by Rajat Mishra */

برنامه محاسبه nامین عدد فیبوناچی در پایتون ۳

1# Helper function that multiplies  
2# 2 matrices F and M of size 2*2,  
3# and puts the multiplication 
4# result back to F[][]  
5  
6# Helper function that calculates  
7# F[][] raise to the power n and  
8# puts the result in F[][] 
9# Note that this function is  
10# designed only for fib() and  
11# won't work as general 
12# power function  
13def fib(n): 
14    F = [[1, 1], 
15         [1, 0]] 
16    if (n == 0): 
17        return 0
18    power(F, n - 1) 
19      
20    return F[0][0] 
21  
22def multiply(F, M): 
23  
24    x = (F[0][0] * M[0][0] + 
25         F[0][1] * M[1][0]) 
26    y = (F[0][0] * M[0][1] +
27         F[0][1] * M[1][1]) 
28    z = (F[1][0] * M[0][0] + 
29         F[1][1] * M[1][0]) 
30    w = (F[1][0] * M[0][1] + 
31         F[1][1] * M[1][1]) 
32      
33    F[0][0] = x 
34    F[0][1] = y 
35    F[1][0] = z 
36    F[1][1] = w 
37  
38def power(F, n): 
39  
40    M = [[1, 1], 
41         [1, 0]] 
42  
43    # n - 1 times multiply the 
44    # matrix to {{1,0},{0,1}} 
45    for i in range(2, n + 1): 
46        multiply(F, M) 
47  
48# Driver Code 
49if __name__ == "__main__": 
50    n = 9
51    print(fib(n)) 
52  
53# This code is contributed  
54# by ChitraNayal

برنامه محاسبه nامین عدد فیبوناچی در #C

1// C# program to find fibonacci number. 
2using System; 
3  
4class GFG { 
5      
6    static int fib(int n) 
7    { 
8        int [,]F = new int[,] {{1, 1}, 
9                               {1, 0} }; 
10        if (n == 0) 
11            return 0; 
12        power(F, n-1); 
13          
14        return F[0,0]; 
15    } 
16      
17    /* Helper function that multiplies 2  
18    matrices F and M of size 2*2, and puts 
19    the multiplication result back to F[][] */
20    static void multiply(int [,]F, int [,]M) 
21    { 
22        int x = F[0,0]*M[0,0] + F[0,1]*M[1,0]; 
23        int y = F[0,0]*M[0,1] + F[0,1]*M[1,1]; 
24        int z = F[1,0]*M[0,0] + F[1,1]*M[1,0]; 
25        int w = F[1,0]*M[0,1] + F[1,1]*M[1,1]; 
26          
27        F[0,0] = x; 
28        F[0,1] = y; 
29        F[1,0] = z; 
30        F[1,1] = w; 
31    } 
32  
33    /* Helper function that calculates F[][]  
34    raise to the power n and puts the result 
35    in F[][] Note that this function is designed 
36    only for fib() and won't work as general 
37    power function */
38    static void power(int [,]F, int n) 
39    { 
40        int i; 
41        int [,]M = new int[,]{{1, 1}, 
42                              {1, 0} }; 
43          
44        // n - 1 times multiply the matrix to 
45        // {{1,0},{0,1}} 
46        for (i = 2; i <= n; i++) 
47            multiply(F, M); 
48    } 
49      
50    /* Driver program to test above function */
51    public static void Main () 
52    { 
53        int n = 9; 
54        Console.WriteLine(fib(n)); 
55    } 
56} 
57  
58// This code is contributed by anuj_67.

برنامه محاسبه nامین عدد فیبوناچی در PHP

1<?php  
2// PHP program for above approach 
3function fib($n) 
4{ 
5    $F = array(array(1, 1), 
6               array(1, 0)); 
7    if ($n == 0) 
8        return 0; 
9    power($F, $n - 1); 
10      
11    return $F[0][0]; 
12} 
13  
14function multiply(&$F, &$M) 
15{ 
16$x = $F[0][0] * $M[0][0] +  
17     $F[0][1] * $M[1][0]; 
18$y = $F[0][0] * $M[0][1] +  
19     $F[0][1] * $M[1][1]; 
20$z = $F[1][0] * $M[0][0] +  
21     $F[1][1] * $M[1][0]; 
22$w = $F[1][0] * $M[0][1] + 
23     $F[1][1] * $M[1][1]; 
24  
25$F[0][0] = $x; 
26$F[0][1] = $y; 
27$F[1][0] = $z; 
28$F[1][1] = $w; 
29} 
30  
31function power(&$F, $n) 
32{ 
33    $M = array(array(1, 1), 
34               array(1, 0)); 
35      
36    // n - 1 times multiply the 
37    // matrix to {{1,0},{0,1}} 
38    for ($i = 2; $i <= $n; $i++) 
39        multiply($F, $M); 
40} 
41  
42// Driver Code 
43$n = 9; 
44echo fib($n); 
45  
46// This code is contributed  
47// by ChitraNayal 
48?>

پیچیدگی زمانی این روش، از درجه (O(n و فضای اضافی آن از درجه (O(1 است.

روش پنجم محاسبه nامین عدد فیبوناچی

این روش، بهینه شده روش پیشین است. در واقع، روش چهارم را می‌توان به نوعی بهینه کرد که با پیچیدگی زمانی (O(Logn کار کند. می‌توان از ضرب بازگشتی برای محاسبه (power(M, n در روش پیشین، استفاده کرد.

برنامه محاسبه nامین عدد فیبوناچی در C

1#include <stdio.h> 
2  
3void multiply(int F[2][2], int M[2][2]); 
4  
5void power(int F[2][2], int n); 
6  
7/* function that returns nth Fibonacci number */
8int fib(int n) 
9{ 
10  int F[2][2] = {{1,1},{1,0}}; 
11  if (n == 0) 
12    return 0; 
13  power(F, n-1); 
14  return F[0][0]; 
15} 
16  
17/* Optimized version of power() in method 4 */
18void power(int F[2][2], int n) 
19{ 
20  if( n == 0 || n == 1) 
21      return; 
22  int M[2][2] = {{1,1},{1,0}}; 
23  
24  power(F, n/2); 
25  multiply(F, F); 
26  
27  if (n%2 != 0) 
28     multiply(F, M); 
29} 
30  
31void multiply(int F[2][2], int M[2][2]) 
32{ 
33  int x =  F[0][0]*M[0][0] + F[0][1]*M[1][0]; 
34  int y =  F[0][0]*M[0][1] + F[0][1]*M[1][1]; 
35  int z =  F[1][0]*M[0][0] + F[1][1]*M[1][0]; 
36  int w =  F[1][0]*M[0][1] + F[1][1]*M[1][1]; 
37  
38  F[0][0] = x; 
39  F[0][1] = y; 
40  F[1][0] = z; 
41  F[1][1] = w; 
42} 
43  
44/* Driver program to test above function */
45int main() 
46{ 
47  int n = 9; 
48  printf("%d", fib(9)); 
49  getchar(); 
50  return 0; 
51}

برنامه محاسبه nامین عدد فیبوناچی در جاوا

1//Fibonacci Series using  Optimized Method 
2class fibonacci 
3{ 
4    /* function that returns nth Fibonacci number */
5    static int fib(int n) 
6    { 
7    int F[][] = new int[][]{{1,1},{1,0}}; 
8    if (n == 0) 
9        return 0; 
10    power(F, n-1); 
11       
12    return F[0][0]; 
13    } 
14       
15    static void multiply(int F[][], int M[][]) 
16    { 
17    int x =  F[0][0]*M[0][0] + F[0][1]*M[1][0]; 
18    int y =  F[0][0]*M[0][1] + F[0][1]*M[1][1]; 
19    int z =  F[1][0]*M[0][0] + F[1][1]*M[1][0]; 
20    int w =  F[1][0]*M[0][1] + F[1][1]*M[1][1]; 
21      
22    F[0][0] = x; 
23    F[0][1] = y; 
24    F[1][0] = z; 
25    F[1][1] = w; 
26    } 
27       
28    /* Optimized version of power() in method 4 */
29    static void power(int F[][], int n) 
30    { 
31    if( n == 0 || n == 1) 
32      return; 
33    int M[][] = new int[][]{{1,1},{1,0}}; 
34       
35    power(F, n/2); 
36    multiply(F, F); 
37       
38    if (n%2 != 0) 
39       multiply(F, M); 
40    } 
41      
42    /* Driver program to test above function */ 
43    public static void main (String args[]) 
44    { 
45         int n = 9; 
46     System.out.println(fib(n)); 
47    } 
48} 
49/* This code is contributed by Rajat Mishra */

برنامه محاسبه nامین عدد فیبوناچی در پایتون ۳

1# Fibonacci Series using  
2# Optimized Method 
3  
4# function that returns nth  
5# Fibonacci number  
6def fib(n): 
7      
8    F = [[1, 1], 
9         [1, 0]] 
10    if (n == 0): 
11        return 0
12    power(F, n - 1) 
13          
14    return F[0][0] 
15      
16def multiply(F, M): 
17      
18    x = (F[0][0] * M[0][0] + 
19         F[0][1] * M[1][0]) 
20    y = (F[0][0] * M[0][1] + 
21         F[0][1] * M[1][1]) 
22    z = (F[1][0] * M[0][0] + 
23         F[1][1] * M[1][0]) 
24    w = (F[1][0] * M[0][1] + 
25         F[1][1] * M[1][1]) 
26      
27    F[0][0] = x 
28    F[0][1] = y 
29    F[1][0] = z 
30    F[1][1] = w 
31          
32# Optimized version of 
33# power() in method 4  
34def power(F, n): 
35  
36    if( n == 0 or n == 1): 
37        return; 
38    M = [[1, 1], 
39         [1, 0]]; 
40          
41    power(F, n // 2) 
42    multiply(F, F) 
43          
44    if (n % 2 != 0): 
45        multiply(F, M) 
46      
47# Driver Code 
48if __name__ == "__main__": 
49    n = 9
50    print(fib(n)) 
51  
52# This code is contributed  
53# by ChitraNayal

برنامه محاسبه nامین عدد فیبوناچی در #C

1// Fibonacci Series using  
2// Optimized Method 
3using System; 
4  
5class GFG 
6{ 
7/* function that returns  
8nth Fibonacci number */
9static int fib(int n) 
10{ 
11int[,] F = new int[,]{{1, 1},  
12                      {1, 0}}; 
13if (n == 0) 
14    return 0; 
15power(F, n - 1); 
16  
17return F[0, 0]; 
18} 
19  
20static void multiply(int[,] F,  
21                     int[,] M) 
22{ 
23int x = F[0, 0] * M[0, 0] +  
24        F[0, 1] * M[1, 0]; 
25int y = F[0, 0] * M[0, 1] +  
26        F[0, 1] * M[1, 1]; 
27int z = F[1, 0] * M[0, 0] +  
28        F[1, 1] * M[1, 0]; 
29int w = F[1, 0] * M[0, 1] +  
30        F[1, 1] * M[1, 1]; 
31  
32F[0, 0] = x; 
33F[0, 1] = y; 
34F[1, 0] = z; 
35F[1, 1] = w; 
36} 
37  
38/* Optimized version of  
39power() in method 4 */
40static void power(int[,] F, int n) 
41{ 
42if( n == 0 || n == 1) 
43return; 
44int[,] M = new int[,]{{1, 1},  
45                      {1, 0}}; 
46  
47power(F, n / 2); 
48multiply(F, F); 
49  
50if (n % 2 != 0) 
51multiply(F, M); 
52} 
53  
54// Driver Code 
55public static void Main () 
56{ 
57    int n = 9; 
58    Console.Write(fib(n)); 
59} 
60} 
61  
62// This code is contributed 
63// by ChitraNayal

پیچیدگی زمانی این روش، از درجه (O(Logn است. اگر اندازه پشته فراخوانی تابع در نظر گرفته شود، فضای اضافی این روش از درجه (O(Logn و در غیر این صورت، از (O(1 است.

روش ششم محاسبه nامین عدد فیبوناچی

در زیر، یک فرمول بازگشتی جالب توجه برای پیدا کردن nامین عدد فیبوناچی در زمان (O(Log n ارائه شده است.

اگر n زوج است، k = n/2:

F(n) = [2*F(k-1) + F(k)]*F(k)

اگر n فرد است، k = (n + 1)/2:

F(n) = F(k)*F(k) + F(k-1)*F(k-1)

این رابطه را می‌توان از معادله ماتریس بالا به دست آورد.

$$\begin{bmatrix}1 & 1 \\1 & 0 \end{bmatrix} ^ n = \begin{bmatrix}F_{n+1} & F_{n} \\F_{n} & F_{n-1} \end{bmatrix}$$

با دترمینان گرفتن از دو طرف معادله، داریم:

$$(-1)^n = F_{n+1}F_{n-1} – F_{n}^2$$

همچنین، با توجه به اینکه رابطه $$ A^nA^m = A^n+m$$ برای هر ماتریس مربعی A برقرار است، ماتریس‌های همانی زیر را می‌توان به دست آورد (این موارد، از دو ضریب مختلف ضرب داخلی ماتریس‌ها به دست آمده‌اند).

$$F_{m} F_{n} + F_{m - 1} F_{n - 1} = F_{m + n - 1}$$

با قرار دادن n = n+1 رابطه زیر به دست می آید:

$$F_{m}F_{n+1} + F_{m - 1}F_{n} = F_{m + n}$$

با قرار دادن m = n روابط زیر حاصل می‌شوند:

$$F_{2n-1} = F_{n}^2 + F_{n-1} ^ 2$$

$$F_{2n} = (F_{n - 1} + F_{n+1})F_{n} = (2F_{n-1}+F_{n})F_{n}$$

برای اثبات این رابطه، باید اقدامات زیر را انجام داد:

  • اگر n زوج است، می‌توان $$k = \frac{n}{2}$$ را قرار داد.
  • اگر n فرد است، می‌توان $$k = \frac{n + 1}{2}$$ را قرار داد.

در ادامه، پیاده‌سازی روش بالا انجام شده است.

برنامه محاسبه nامین عدد فیبوناچی در ++C

1// C++ Program to find n'th fibonacci Number in 
2// with O(Log n) arithmatic operations 
3#include <bits/stdc++.h> 
4using namespace std; 
5  
6const int MAX = 1000; 
7  
8// Create an array for memoization 
9int f[MAX] = {0}; 
10  
11// Returns n'th fuibonacci number using table f[] 
12int fib(int n) 
13{ 
14    // Base cases 
15    if (n == 0) 
16        return 0; 
17    if (n == 1 || n == 2) 
18        return (f[n] = 1); 
19  
20    // If fib(n) is already computed 
21    if (f[n]) 
22        return f[n]; 
23  
24    int k = (n & 1)? (n+1)/2 : n/2; 
25  
26    // Applyting above formula [Note value n&1 is 1 
27    // if n is odd, else 0. 
28    f[n] = (n & 1)? (fib(k)*fib(k) + fib(k-1)*fib(k-1)) 
29           : (2*fib(k-1) + fib(k))*fib(k); 
30  
31    return f[n]; 
32} 
33  
34/* Driver program to test above function */
35int main() 
36{ 
37    int n = 9; 
38    printf("%d ", fib(n)); 
39    return 0; 
40} 

برنامه محاسبه nامین عدد فیبوناچی در جاوا

1// Java Program to find n'th fibonacci  
2// Number with O(Log n) arithmetic operations 
3import java.util.*; 
4  
5class GFG { 
6      
7    static int MAX = 1000; 
8    static int f[]; 
9      
10    // Returns n'th fibonacci number using  
11    // table f[] 
12    public static int fib(int n) 
13    { 
14        // Base cases 
15        if (n == 0) 
16            return 0; 
17              
18        if (n == 1 || n == 2) 
19            return (f[n] = 1); 
20       
21        // If fib(n) is already computed 
22        if (f[n] != 0) 
23            return f[n]; 
24       
25        int k = (n & 1) == 1? (n + 1) / 2 
26                            : n / 2; 
27       
28        // Applyting above formula [Note value 
29        // n&1 is 1 if n is odd, else 0. 
30        f[n] = (n & 1) == 1? (fib(k) * fib(k) +  
31                        fib(k - 1) * fib(k - 1)) 
32                       : (2 * fib(k - 1) + fib(k))  
33                       * fib(k); 
34       
35        return f[n]; 
36    } 
37      
38    /* Driver program to test above function */
39    public static void main(String[] args)  
40    { 
41        int n = 9; 
42        f= new int[MAX]; 
43        System.out.println(fib(n)); 
44    } 
45} 
46      
47// This code is contributed by Arnav Kr. Mandal.

برنامه محاسبه nامین عدد فیبوناچی در پایتون

1# Python 3 Program to find n'th fibonacci Number in 
2# with O(Log n) arithmatic operations 
3MAX = 1000
4  
5# Create an array for memoization 
6f = [0] * MAX
7  
8# Returns n'th fuibonacci number using table f[] 
9def fib(n) : 
10    # Base cases 
11    if (n == 0) : 
12        return 0
13    if (n == 1 or n == 2) : 
14        f[n] = 1
15        return (f[n]) 
16  
17    # If fib(n) is already computed 
18    if (f[n]) : 
19        return f[n] 
20  
21    if( n & 1) : 
22        k = (n + 1) // 2
23    else :  
24        k = n // 2
25  
26    # Applyting above formula [Note value n&1 is 1 
27    # if n is odd, else 0. 
28    if((n & 1) ) : 
29        f[n] = (fib(k) * fib(k) + fib(k-1) * fib(k-1)) 
30    else : 
31        f[n] = (2*fib(k-1) + fib(k))*fib(k) 
32  
33    return f[n] 
34  
35  
36# Driver code 
37n = 9
38print(fib(n)) 
39  
40  
41# This code is contributed by Nikita Tiwari.

برنامه محاسبه nامین عدد فیبوناچی در #C

1// C# Program to find n'th  
2// fibonacci Number with  
3// O(Log n) arithmetic operations 
4using System; 
5  
6class GFG 
7{ 
8  
9static int MAX = 1000; 
10static int[] f; 
11  
12// Returns n'th fibonacci  
13// number using table f[] 
14public static int fib(int n) 
15{ 
16    // Base cases 
17    if (n == 0) 
18        return 0; 
19          
20    if (n == 1 || n == 2) 
21        return (f[n] = 1); 
22  
23    // If fib(n) is already  
24    // computed 
25    if (f[n] != 0) 
26        return f[n]; 
27  
28    int k = (n & 1) == 1 ? (n + 1) / 2 
29                         : n / 2; 
30  
31    // Applyting above formula  
32    // [Note value n&1 is 1 if  
33    // n is odd, else 0. 
34    f[n] = (n & 1) == 1 ? (fib(k) * fib(k) +  
35                           fib(k - 1) * fib(k - 1)) 
36                        : (2 * fib(k - 1) + fib(k)) *  
37                                            fib(k); 
38  
39    return f[n]; 
40} 
41  
42// Driver Code 
43static void Main()  
44{ 
45    int n = 9; 
46    f = new int[MAX]; 
47    Console.WriteLine(fib(n)); 
48} 
49} 
50  
51// This code is contributed by mits

برنامه محاسبه nامین عدد فیبوناچی در PHP

خروجی

خروجی قطعه کدهای بالا برای n = 9 به صورت زیر است.

34

پیچیدگی زمانی این روش، از درجه (O(Log n است، زیرا در هر فراخوانی بازگشتی، مساله به نیمی تقسیم (شکسته) می‌شود.

روش هفتم محاسبه nامین عدد فیبوناچی

در این روش، فرمول به طور مستقیم برای nامین عبارت سری فیبوناچی پیاده‌سازی می‌شود.

$$F_{n} = \frac{\{[\frac{\sqrt{5}+1}{2}]^{n}\}}{\sqrt{5}}$$

برنامه محاسبه nامین عدد فیبوناچی در ++C

1// C++ Program to find n'th fibonacci Number 
2#include<iostream> 
3#include<cmath> 
4  
5int fib(int n) { 
6  double phi = (1 + sqrt(5)) / 2; 
7  return round(pow(phi, n) / sqrt(5)); 
8} 
9  
10// Driver Code 
11int main () 
12{ 
13  int n = 9; 
14  std::cout << fib(n) << std::endl; 
15  return 0; 
16} 
17//This code is contributed by Lokesh Mohanty.

برنامه محاسبه nامین عدد فیبوناچی در C

برنامه محاسبه nامین عدد فیبوناچی در جاوا

برنامه محاسبه nامین عدد فیبوناچی در #C

برنامه محاسبه nامین عدد فیبوناچی در PHP

خروجی

خروجی قطعه کد بالا، برای n = 9 به صورت زیر است.

34

پیچیدگی زمانی این روش از درجه (O(1 و پیچیدگی فضایی آن نیز از درجه (O(1 است.

بر اساس رای ۹ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
GeeksforGeeks
۳ دیدگاه برای «برنامه محاسبه nامین عدد فیبوناچی — به زبان ساده»

با سلام و عرض خسته نباشید
بنده دو عدد کد برای برنامه نویسی پایتون میخواستم ممنون میشم کمکم کنید.
1- برنامه اي بنويسيد كه روز و ماه تولد شخص را بگيرد و بگويد در چندمين روز سال به دنيا آمده است
2 -برنامه اي بنويسيد كه حقوق شخص و نرخ ماليات را گرفته سپس حقوق خالص وي را چاپ كند. نرخ مالیات * حقوق نا خالص = حقوق خالص

سلام
با عرض تشکر
قسمت 7 رو اشتباه نوشتید
فرمول فیبوناچی :
F(n)=(x^n – (-x^-n))/sqrt(5)
x=(1+sqrt(5))/2

با سلام؛

از همراهی شما با مجله فرادرس و ارائه بازخورد سپاس‌گزاریم. فرمول موجود در قسمت هفت صحیح است. آنچه شما به عنوان فرمول محاسبه nاُمین عدد فیبوناچی ارائه کرده‌اید یکی از متداول‌ترین و شناخته‌شده‌ترین روابط برای محاسبه عدد فیبوناچی است، اما تنها راه موجود نیست. فرمول‌های اثبات شده و صحیح دیگری نیز برای محاسبه nاُمین عدد فیبوناچی وجود دارند که گاه به دلایل گوناگون از آن‌ها استفاده می‌شود.
در این مطلب، هفت روش برای محاسبه nاُمین عدد فیبوناچی ارائه شده است که فرمول ارائه شده در قسمت هفت یکی از این موارد است. این فرمول با استفاده از روش اصلی محاسبه nاُمین عدد فیبوناچی به دست آمده و اثبات شده است. پرداختن به اثبات این فرمول از حوصله این مطلب خارج و بنابراین، صرفا خود فرمول ارائه شده است. اشکال مربوط به این فرمول، عدم وجود رادیکال در مخرج بود که این مورد اصلاح شد.
در صورتی که کد ++C نوشته شده بر اساس این فرمول را در کامپایلر اجرا کنید، مشاهده خواهید کرد که خروجی کاملا صحیح است.

شاد، پیروز و تندرست باشید.

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *