斐波那契函数与 C

Fibonacci function with C

我想计算斐波那契数列的第i句:

#include <stdio.h>

int fibo(int i);

int main()
{
    return 0;
}

int fibo(int i)
{
    switch (i)
    {
    case 1:
        return 0;
        break;
    case 2:
        return 1;
        break;
    default:
        int a = 0, b = 1;
        for (int p = 3; p <= i; p++)
        {
            b += a;
            a = b - a;
        }
        return b;
        break;
    }
}

但是 int a = 0, b = 1; 的第 18 行出现错误,如下所示:

10.c: In function 'fibo':
10.c:18:9: error: a label can only be part of a statement and a declaration is not a statement
   18 |         int a = 0, b = 1;
      |         ^~~

我使用 VS Code IDE。

  #include <stdio.h>
    int fibo(int i);
    int main()
    {
        return 0;
    }
    int fibo(int i)
    {
        int a = 0, b = 1;
        switch (i)
        {
        case 1:
            return a;
            break;
        case 2:
            return b;
            break;
        default:
            for (int p = 3; p <= i; p++)
            {
                b += a;
                a = b - a;
            }
            return b;
            break;
        }
    }

这里我在 switch case 之外使用了声明部分,因为在标签内部只允许语句而不是声明。

在 C 中,在 switch 语句中,在 case 中,要有局部变量,case 的主体必须用大括号 '{' 和 ' }'

C 语法不允许标记声明。 default:case <expr>: 是标签。有 3 种方法可以解决代码中的问题:

  • 将声明移到 switch 语句的主体之外:

    int fibo(int i) {
        int a, b;
        switch (i) {
        case 1:
            return 0;
        case 2:
            return 1;
        default:
            a = 0, b = 1;
            for (int p = 3; p <= i; p++) {
                b += a;
                a = b - a;
            }
            return b;
        }
    }
    
  • 在块中包含声明:

    int fibo(int i) {
        switch (i) {
        case 1:
            return 0;
        case 2:
            return 1;
        default: {
                int a = 0, b = 1;
                for (int p = 3; p <= i; p++) {
                    b += a;
                    a = b - a;
                }
                return b;
            }
        }
    }
    
  • 在标签后添加空语句:

    int fibo(int i) {
        switch (i) {
        case 1:
            return 0;
        case 2:
            return 1;
        default:;  // this is a null statement
            int a = 0, b = 1;
            for (int p = 3; p <= i; p++) {
                b += a;
                a = b - a;
            }
            return b;
        }
    }
    

另请注意这些评论:

  • 您的 fibo 函数中的 break; 语句从未达到,应该删除,

  • case 2: 是多余的:default: 代码会产生相同的结果,

  • 您的代码没有实现经典的斐波那契数列:1 1 2 3...而是生成 0 1 1 2...您应该将测试更改为:

    int fibo(int i) {
        switch (i) {
        case 0:
            return 0;
        default:;  // this is a null statement
            int a = 1, b = 1;
            for (int p = 2; p < i; p++) {
                b += a;
                a = b - a;
            }
            return b;
        }
    }
    
  • 对于负数,您可能也应该 return 0。只需将代码简化为:

    int fibo(int i) {
        int a = 1, b = 0;
        while (i-- > 0) {
            b += a;
            a = b - a;
        }
        return b;
    }