Khi đã bình tĩnh, thì mình đã có thể giải được câu hỏi này, dù giải pháp chưa thật sự tốt. Đề bài yêu cầu như sau: In ra n số Fibonacci ra console, đơn giản vậy thôi. Ví dụ, nếu n = 10 thì in ra: 1 2 3 5 8 13 21 34 55 89.
Định nghĩa: Dãy Fibonacci là một dãy số nổi tiếng trong toán học, được đặt theo tên của nhà toán học người Ý Leonardo Fibonacci. Dãy Fibonacci bắt đầu từ hai số 0 và 1 (hoặc 1 và 1 tùy theo cách định nghĩa), và các số tiếp theo được tạo ra bằng cách cộng hai số liền trước đó.
Dựa vào định nghĩa trên, với dãy Fibonacci bắt đầu từ số 1 và 2, các số tiếp theo được tính như sau: 1+2=3, 2+3=5, 3+5=8 v.v...
Sau một hồi suy nghĩ, mình viết được đoạn code như sau bằng Java, sử dụng ArrayList với khởi tạo ban đầu chứa sẵn 2 số 1 và 2; các số tiếp theo được tính toán dựa trên tổng của 2 số liền kề trước đó:
import java.util.ArrayList;
public class Main
{
public static void main(String[] args) {
var n = 10;
var numbers = new ArrayList<Integer>();
numbers.add(1);
numbers.add(2);
for (var i = 2; i < 10; i++) {
var nextNumber = numbers.get(i - 1) + numbers.get(i - 2);
numbers.add(nextNumber);
}
for (var number : numbers) {
System.out.print(number + " ");
}
}
}
Đầu tiên, ở đây có 2 vòng lặp, mình sẽ tìm cách giảm xuống còn 1, tức là bằng cách nào đó để khi vừa tính toán ra số kế tiếp thì chúng ta in nó ra luôn. Và nếu đã in được số ra luôn thì có lẽ không cần tới ArrayList làm gì nữa.
Vậy, có thể dùng 2 biến để chứa 2 giá trị ban đầu (1 và 2) thay cho mảng. Trong vòng lặp, ngay sau khi tính được số tiếp theo, chúng ta sẽ cập nhật giá trị 2 biến này "ngay tại chỗ", đồng thời in kết quả ra màn hình. Với suy nghĩ như trên, một phiên bản tốt hơn của bài tập đã được viết lại như bên dưới:
public class Main
{
public static void main(String[] args) {
var n = 10;
var a = 1;
var b = 2;
System.out.print(a + " ");
System.out.print(b + " ");
for (var i = 2; i < n; i++) {
var nextNumber = a + b;
a = b;
b = nextNumber;
System.out.print(nextNumber + " ");
}
}
}
- Hai biến a và b sẽ được khởi tạo lần lượt các giá trị 1 và 2, và sẽ được in ra ngay sau khi khởi tạo.
- Vòng lặp vẫn bắt đầu từ i=2 (tương ứng với số thứ 3), đơn giản vì hai số đầu tiên đã có.
- Số tiếp theo (nextNumber) được tính bằng tổng của a và b.
- Giá trị của b được gán lại cho a.
- Và giá trị của nextNumber được gán lại cho b, chuẩn bị sẵn sàng cho vòng lặp tiếp theo.
Và cuối cùng, hãy viết lại đoạn code của chúng ta sang C nhé:
#include <stdio.h>
int main() {
int n = 10;
int a = 1, b = 2;
printf("%d ", a);
printf("%d ", b);
for (int i = 2; i < n; i++) {
int nextNumber = a + b;
a = b;
b = nextNumber;
printf("%d ", nextNumber);
}
return 0;
}
Trên đây là một ví dụ đơn giản về cách tạo và in ra dãy Fibonacci bằng ngôn ngữ Java. Qua bài tập này, chúng ta không chỉ hiểu rõ hơn về cách hoạt động của dãy Fibonacci mà còn thấy được sự linh hoạt của vòng lặp và cách quản lý biến trong lập trình. Dãy Fibonacci không chỉ là một khái niệm toán học thú vị mà còn có nhiều ứng dụng thực tế trong khoa học máy tính, tài chính, và cả nghệ thuật. Hãy thử thay đổi giá trị của n hoặc khởi tạo dãy với các số khác nhau để khám phá thêm nhé! Chúc bạn có những trải nghiệm thú vị khi lập trình!