斐波那契函数与 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;
}
我想计算斐波那契数列的第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; }