1.对于斐波那契数列的理解:
(1)常规
该数列由兔子繁衍的想法产生,故又“兔子数列”
其数值为:1、1、2、3、5、8、13、21、34
从数学定义上走:F(0)=1,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)。
(2)非常规
同斐波那契的定义一样,只是初始值发生变化,也被称为“奇怪的斐波那契数列”
2.对于求第N个斐波那契数列的元素的个人想法:
一:通过数学推导斐波那契的通项公式,从而由通项公式直接求值:
下列给出求解常规斐波那契数列的方法一
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
int main()
{
int n, sum, i;
int c = 0;
double num,num_1,num_2,num_3,n_2,n_3;
num = sqrt(5.0);
num_1 = 1.0 / sqrt(5.0);
num_2 = (1.0 + sqrt(5.0)) / 2.0;
num_3 = (1.0 - sqrt(5.0)) / 2.0;
scanf("%d", &n);
if (0 < n && n<= 1)
{
printf("1");
}
else if (n > 1)
{
for (i = 3;i>0;i++)
{
n_2 = pow(num_2, i);
n_3 = pow(num_3, i);
sum = num_1 * (n_2 - n_3);
if (sum >= n)
{
c = i;
break;
}
}
printf("%d",i);
}
return 0;
}
二:通过迭代法,求解第N个斐波那契数列的数字的值
下列给出求解奇怪的斐波那契数列的特定项值的方法二:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
int a = 7;
int b = 11;
int n;
int c;
c = a + b;
scanf("%d", &n);
for (n; n >1; n--)
{
a = b;
b = c;
c = a + b;
}
printf("%d", a);
printf(" %s", (a % 3 == 0)? "yes": "no");
return 0;
}
此程序用来判断奇怪的斐波那契数列的第N个值是否为3的倍数,而其底层思想就是通过程序的循环迭代实现一轮一轮下来的求值。
3.思想总结
(1)斐波那契数列的特定数学规律,决定了它可以通过迭代法求值的底层逻辑,但同时也要关注到在这种迭代法的运行下,当n值达到30至40以上的时候容易出现爆值,导致程序运行错误。而同时使用循环进行迭代的运行时长较长,运行效率不高
(2)而由数学原理推导出斐波那契数列的通项公式,转化成程序,则是实现了定点求值,直接由表达式进行求值并对变量进行赋值处理,但同时也要关注到根号下数值对应的变量类型,防止隐式转换下造成的精度下降,数据溢出的情况,所以最好将通项公式中的常量分开求值,在通过变量赋值代入到总表达式中,实现斐波那契数列的通项公式,从而保证了求值的精确度。