0

我正在尝试编写斐波那契数列的前 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);
}
4

6 回答 6

0

首先,我建议将您的数据类型从浮点数更改为整数或其他数据类型。浮点数不是精确的数字,如果你使用了 while (n = maxn) 而不是 while (n <= maxn) 你可能会得到一个无限循环,因为这两个浮点数永远不会匹配。

其次,您似乎并不真正了解斐波那契数列是什么。查看维基百科文章http://en.wikipedia.org/wiki/Fibonacci_number

fibinocci 数不是 (n - 1) + (n - 2) 像你一样。它是序列中前两个数字的总和。您需要重新构建循环以保存最后两个值并根据这些值计算下一个值。

于 2013-09-17T18:56:01.523 回答
0

对于斐波那契数列,值 f(n) = f(n - 1) + f(n = 2)。前三个值定义为 0、1、1。

斐波那契数列是一个整数值序列(数学整数,不一定是 C 语言值)。考虑使用 int 或 long 作为斐波那契值。float 毫无价值,它只会增加不必要的开销。

在计算斐波那契数列时,您必须存储前 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;
}
于 2013-09-17T18:54:19.577 回答
0

您只需运行循环 10 次,即可找到斐波那契数列的前 10 项。

在您的代码中,由于循环末尾的分号,while 循环不会让您走得更远

//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); 通过看到这个片段

于 2013-09-17T18:55:17.267 回答
0

有(至少)两种方法可以在 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);
}
于 2013-09-17T19:02:37.197 回答
0

这使用 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);
}
于 2014-05-07T21:53:33.527 回答
0

建议

  1. 在做整数问题时,在 FP 类型之前考虑整数类型。

  2. ;在你的省略一个while (n <= maxn);{

  3. .在浮点格式中使用 a%4.2f而不是%4,2f.

  4. 斐波那契是前两项之和,而不是简单的fib = (n - 1) + (n - 2).

  5. 考虑一个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]; 
  }
}  
于 2013-09-17T19:48:13.787 回答