Select solution language
Chúng ta cần liệt kê tất cả các xâu nhị phân có độ dài ( n ).
Mỗi xâu nhị phân gồm các ký tự 0
và 1
.
Ví dụ: ( n = 3 )
0
hoặc 1
0
1
00
01
10
11
000
001
010
011
100
101
110
111
Nhận xét:
#include <bits/stdc++.h>
using namespace std;
void Xau_nhi_phan(int n, string s = "") {
if (s.size() == n) {
cout << s << endl;
return;
}
// Goi de quy voi 2 nhanh
Xau_nhi_phan(n, s + "0");
Xau_nhi_phan(n, s + "1");
}
int main() {
int n; cin >> n;
Xau_nhi_phan(n); //Goi ham
return 0;
}
Xau_nhi_phan(n, s)
s.size() == n
, in ra s
(xâu đã hoàn thành).s.size() < n
, ta tiếp tục mở rộng:s
và gọi đệ quy (Xau_nhi_phan(n, s + "0")
).s
và gọi đệ quy (Xau_nhi_phan(n, s + "1")
).n = 3
""
/ \
"0" "1"
/ \ / \
"00" "01" "10" "11"
/ \ / \ / \ / \
"000" "001" "010" "011" "100" "101" "110" "111"
0
hoặc 1
).n
bước, số xâu nhị phân sinh ra là ( 2^n ).✅ Sử dụng đệ quy giúp bài toán đơn giản và dễ hiểu.
✅ Cấu trúc cây nhị phân thể hiện rõ cách sinh xâu.
✅ Giải thuật có thể mở rộng để áp dụng vào các bài toán tương tự.
💡 Có thể tối ưu nếu chỉ cần đếm số lượng xâu thay vì in ra chúng.
💡 Nếu ( n ) quá lớn (ví dụ ( n > 20 )), cần cân nhắc tối ưu hoặc sử dụng phương pháp khác do giới hạn thời gian.
Cảm ơn quý độc giả đã theo dõi
Cho một số nguyên n
, yêu cầu in ra tất cả các xâu nhị phân có độ dài n
. Xâu nhị phân chỉ bao gồm các ký tự '0'
và '1'
.
Để sinh ra tất cả các xâu nhị phân có độ dài n
, ta có thể sử dụng phương pháp đệ quy. Mỗi lần đệ quy, ta sẽ nối thêm ký tự '0'
hoặc '1'
vào xâu hiện tại và tiếp tục gọi đệ quy cho đến khi xâu đạt độ dài n
.
n
, ta sẽ in ra xâu đó và dừng lại.'0'
và một với ký tự '1'
.def xaunhiphan(n, xau=""):
if len(xau) == n: # Nếu độ dài xâu đã đạt n
print(xau)
return
for i in ["0", "1"]: #chọn kí tự '0' hoặc '1' để bắt đầu hàm hoặc thêm vào xâu
xaunhiphan(n, xau + i) # Gọi đệ quy với xâu hiện tại cộng thêm '0' hoặc '1'
n = int(input())
xaunhiphan(n) # bắt đầu hàm