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