斐波那契算法
一.非递归算法
我们知道斐波那契数列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; }