一、求斐波那契数列思路
斐波那契数列(Fibonacci sequence),又称黄金分割数列,
因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,
故又称“兔子数列”,其数值为:1、1、2、3、5、8、13、21、34……
这个数列从第3项开始,每一项都等于前两项之和。
二、方法
1.递归
由斐波那契数列的规律可知,这个数列从第3项开始,
每一项都等于前两项之和。因此其第n项等于n-1项与n-2项的和。
示例代码
#include <stdio.h>
int F(int n) //斐波那契数列函数 递归形式
{
if (n == 0) //初始化
return 0;
if (n == 1 || n == 2)
return 1;
return F(n - 1) + F(n - 2); //如果n != 1 && n != 2 进行递归运算
}
int main()
{
int t, n;
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
printf("%d\n", F(n));
}
return 0;
}
2.迭代
由斐波那契数列从第3项开始,每一项都等于前两项之和可知,
可以用一个for循环,a、b分别为前两项,c为前两项之和,
得到c后进行交换更新a、b的值,进行n次交换即可。
示例代码
#include <stdio.h>
int fibonacci(int n) //定义斐波那契函数
{
if (n == 0) //定义初始值
return 0;
if (n == 1 || n == 2)
return 1;
int a = 1, b = 1, c = 0; //定义初始值
//用一个for循环,a、b分别为前两项,c为前两项之和,
//得到c后进行交换更新a、b的值,进行n次交换即可。
for (int i = 3; i <= n; i++) //更新操作
{
c = a + b;
a = b;
b = c;
}
return c; //c即为结果输出
}
int main()
{
int t, n;
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
printf("%d\n", fibonacci(n));
}
return 0;
}
3.公式
示例代码
#include <stdio.h>
#include <math.h>
//pow(x,n):求x的n次幂
//sqrt(n):求n的平方根
//使用这两个函数需要包含: matn.h 头文件
long long fib(int n)
{
return (pow(1+sqrt(5))/2,n) - pow(1-sqrt(5))/2,n))/sqrt(5);
}
int main()
{
int n = 0;
scanf("%d",&n);
n = fib(n);
printf("%d",n);
return 0;
}
三、前n项和
由前面三种方法我们可以得到斐波那契数列的每一项,那么我们便可由此得出其前n项和
示例代码
#include<stdio.h>
int fbnq(int n)//这里用递归的方式来示例
{
if (n == 1 || n == 2)
{
return 1;
}
else
{
return fbnq(n - 1) + fbnq(n - 2);//求出每一项
}
}
int main()
{
int n;
int sum = 0;
scanf_s("%d", &n);
printf("斐波那契数列:");
for (int i = 1; i <= n; i++)
{
printf("%d ", fbnq(i));//从第一项开始打印每一项
sum += fbnq(i);//从第一项开始相加到第n项
}
printf("\nsum=%d\n", sum);//输出前n项和
return 0;
}