斐波那契兩種算法(C語言)


斐波那契算法

一.非遞歸算法

   我們知道斐波那契數列0,1,1,2,3,5,8,13,21,34,55,........,其規律就是前兩個數相加等於后面的第三個數,所以在寫C語言的時候,必須有兩個初始的數字a=0 b=1

那么第三個數字next=a+b,斐波那契數是數列,無窮無盡,為了輸出指定的數列的個數,例如輸出n個,那么就是循環n次,只要我們知道1次的規律,循環n次不

就是1乘n次么

     首先根據上面所說的我們需要使用C語言定義一些變量

    int a=0,b=1,next;  /*初始的變量a,b和下一個數字next*/
    int i,n;           /*定義變量*/ 

      變量定義完成后,我們就研究下什么是快樂星球?不不不,是循環n次中的那個一次邏輯,為了輸出數列,首先輸出第一個元素,為了讓你更好的理解,

這里打一個比喻,把輸出的部分當作拆橋,產生的部分當作搭橋

  

printf("%d,",a);    /*輸出第一個元素*/

         上述輸出第一個元素了,后面的元素相當於拆掉了,那你必須前面鋪一個元素,開始搭橋

next = a+b;  /*產生新的元素*/
a = b;       /*將b的值傳遞給a*/
b = next;    /*新的元素的值傳遞給b*/

       將上述代碼使用for循環將1次循環為n次

#include <stdio.h>   /*C編程的標准IO輸出輸入頭文件(預處理)*/


int main(){
    
    int a=0,b=1,next;  /*初始的變量a,b和下一個數字next*/
    int i,n;           /*定義變量*/ 
    
    /*===輸入部分,控制n的值===*/
      printf("請輸入輸出的數列的個數:");
      scanf("%d",&n);
    
    for(i=0;i<=n;i++){
            /*=====循環中的一次經歷的代碼====*/
                printf("%d,",a);
                next = a+b;  /*產生新的元素*/
                a = b;       /*將b的值傳遞給a*/
                b = next;    /*新的元素的值傳遞給b*/ 
            /*=====循環中的一次經歷的代碼====*/
    }
    return 0;
     
} 

二.遞歸算法

 什么是遞歸?什么是快樂星球,如果你想知道的話我這就帶你研究;

       從前有座山,山里有座廟,廟里有個老和尚,正在給小和尚講故事呢!故事是什么呢?"從前有座山,山里有座廟,廟里有個老和尚,正在給小和尚講故事呢!故事是什么呢?'從前有座山,山里有座廟,廟里有個老和尚,正在給小和尚講故事呢!故事是什么呢?……'"

   遞歸,就是在運行的過程中調用自己!~,例如上面的故事,黑體的部分就是”本我“,利用自我實現超我的過程就是遞歸

 首先定義一個函數f(x),其實遞歸就是自我分解追溯自己的最初的根基,斐波那契的根基就是a =0,b=1,從后往前推的過程

int f(int i)
{
   if(i == 0)   /*第一個數字為返回1*/
   {
      return 0;
   }
   if(i == 1)  /*第二個數字為返回2*/ 
   {
      return 1;
   }
   return f(i-1) + f(i-2); /*第i個數為前兩個數之和*/ 
}
 

下面就是循環過程了

int  main()
{
    int i;
    for (i = 0; i < 10; i++)
    {
       printf("%d\t\n", fibonaci(i));
    }
    return 0;
}

整體的可以運行的代碼

#include <stdio.h>
 
int fibonaci(int i)
{
   if(i == 0)   /*第一個數字為返回1*/
   {
      return 0;
   }
   if(i == 1)  /*第二個數字為返回2*/ 
   {
      return 1;
   }
   return fibonaci(i-1) + fibonaci(i-2); /*第i個數為前兩個數之和*/ 
}
 
int  main()
{
    int i;
    for (i = 0; i < 10; i++)
    {
       printf("%d\t\n", fibonaci(i));
    }
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM