斐波那契算法
一.非遞歸算法
我們知道斐波那契數列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; }