我正在尝试编写斐波那契数列的前 10 项。我觉得我在正确的路线上,但我似乎无法完全掌握实际代码(在 C 中)。
float fib = 0;
const float minn = 1;
const float maxn = 20;
float n = minn;
while (n <= maxn);{
n = n + 1;
printf (" %4,2f", fib);
fib = (n - 1) + (n - 2);
}
对于斐波那契数列,值 f(n) = f(n - 1) + f(n = 2)。 前三个值定义为 0、1、1。
斐波那契数列是整数值(数学整数,不一定是 C 语言值)的序列。 考虑使用 int 或 long 作为斐波那契值。 浮点数毫无价值,它只会增加不必要的开销。
计算斐波那契数列时,您必须存储前 2 个值才能获得下一个值。
你想要 10 个斐波那契值。 您已经知道前三个值,因此请打印它们,然后计算接下来的七个值。
7个值表示迭代 7 次的循环。 它与返回的斐波那契值的最大值无关,只是要打印多少个值。
做这样的事情:
printf("0, 1, 1");
int currentValue;
int valueN1 = 1;
int valueN2 = 1;
for (int counter = 1; counter <= 7; ++counter)
{
currentValue = valueN1 + valueN2;
printf(", %d", currentValue);
valueN2 = valueN1;
valueN1 = currentValue;
}
您只需运行循环 10 次,即可找到斐波那契数列的前 10 项。
在你的代码中,虽然循环不会让你走得更远,因为循环末尾的分号
//declare fib value as long int or unsigned int
// because the value of any fib term is not at all
long int fib;
int n=1;
while (n <= 10)
{
printf (" %d", fib);
fib = fib_term(n);
n = n + 1;
}
通过查看此代码段实现 fib_term(int n);通过查看此代码段
首先,我建议将数据类型从浮点数更改为整数或其他数据类型。 浮点数不是精确的数字,如果您使用 while (n = maxn) 而不是 while (n <= maxn),您最终可能会得到无限的面包,因为两个浮点数永远不会匹配。
其次,你似乎并不真正理解斐波那契数列是什么。看看维基百科文章 http://en.wikipedia.org/wiki/Fibonacci_number。
fibinocci 数不像您那样是 (n - 1) + (n - 2)。 它是序列中前两个数字的总和。 您需要重构循环以保存最后两个值,并根据这些值计算下一个值。
(至少)有两种方法可以在 C 中实现斐波那契算法:
迭代:
int fib(int n){
if (n == 0)
return 0;
int a = 1
int b = 1;
for (int i = 3; i <= n; i++) {
int c = a + b;
a = b;
b = c;
}
return b;
}
递归:
unsigned int fibonacci_recursive(unsigned int n)
{
if (n == 0)
{
return 0;
}
if (n == 1) {
return 1;
}
return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2);
}
void main(){
unsigned int i = fibonacci_recursive(10);
}
建议
-
在执行整数问题时,先考虑整数类型,然后再考虑 FP 类型。
-
省略
while (n <= maxn);{
中的;
-
使用浮点格式的
.
%4.2f
而不是%4,2f
。 -
斐波那契是前 2 项的总和,而不仅仅是
fib = (n - 1) + (n - 2)
. -
考虑一个
unsigned
解决方案:
C 代码:
void Fibonacci_Sequence(unsigned n) {
const unsigned minn = 1;
const unsigned maxn = 20;
unsigned F[3];
F[0] = 0;
F[1] = 1;
unsigned i = 0;
for (i = 0; i <= maxn; i++) {
if (i >= minn) printf(" %u,", F[0]);
F[2] = F[1] + F[0];
F[0] = F[1];
F[1] = F[2];
}
}
这使用 n/2 次迭代
#include<stdio.h>
main()
{
int i,n,a=0,b=1,odd;
scanf("%d",&n);
odd=n%2;
for(i=1;i<=n/2;i++)
{
printf("%d %d ",a,b);
a=a+b;
b=a+b;
}
if(odd)
printf("%d",a);
}