Hàm Fibonacci với C
Tôi muốn tính toán câu thứ i của dãy Fibonacci :
#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;
}
}
Nhưng nó có một lỗi cho dòng 18 int a = 0, b = 1;như sau:
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;
| ^~~
Tôi sử dụng Mã VS cho IDE.
Trả lời
trong C, trong một switchcâu lệnh, trong a case, để có một biến cục bộ, phần thân của biến casephải được đặt trong dấu ngoặc nhọn '{' và '}'
#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;
}
}
Ở đây tôi sử dụng phần khai báo bên ngoài trường hợp switch vì bên trong nhãn chỉ cho phép các câu lệnh không được khai báo.
Ngữ pháp C không cho phép một khai báo được gắn nhãn. default:và case <expr>:là các nhãn. Có 3 cách để khắc phục sự cố trong mã của bạn:
di chuyển các khai báo ra bên ngoài phần nội dung của
switchcâu lệnh: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; } }bao gồm các khai báo trong một khối:
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; } } }thêm một câu lệnh null sau nhãn:
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; } }
Cũng lưu ý những nhận xét sau:
các
break;câu lệnh trongfibohàm của bạn không bao giờ đạt được và nên bị xóa,các
case 2:là không cần thiết: cácdefault:mã sẽ tạo ra kết quả tương tự,mã của bạn không triển khai chuỗi Fibonacci cổ điển:
1 1 2 3... thay vào đó nó tạo ra0 1 1 2... Bạn nên thay đổi các kiểm tra thành sau: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; } }bạn cũng nên trả về
0số âm. Chỉ cần đơn giản hóa mã như:int fibo(int i) { int a = 1, b = 0; while (i-- > 0) { b += a; a = b - a; } return b; }