Author: sieusale.day

  • Xác suất có điều kiện – Công thức Bayes

    Xác suất có điều kiện – Công thức Bayes

    xác suất có điều kiện, định lý công thức bayes

    Xác suất có điều kiện – Công thức Bayes

    Công thức tính Xác suất có điều kiệnđịnh lý Bayes (Bayes’ Theorem) là các công cụ mạnh mẽ để tính xác suất xảy ra của một sự kiện (biến cố – event) ngẫu nhiên A khi biết sự kiện liên quan B đã xảy ra.

    Mời xem thêm bài tập xác suất thống kê của ĐH Bách Khoa HN:

    1. Xác suất có điều kiện

    1.1. Ví dụ về xác suất có điều kiện

    Xác suất có điều kiện (Conditional probability) là xác suất của một biến cố $ A$ nào đó khi biết rằng một biến cố $ B$ khác xảy ra. Ký hiệu $ \mathrm{P}(A|B)$, và đọc là “xác suất của $ A$, biết $ B$”.

    Chẳng hạn, rút một lá bài từ một bộ bài có $52$ lá, xác suất để lấy được một lá Át là $ 1/52$. Nhưng nếu người chơi đã rút được lá Át rồi, nếu tiếp tục rút thêm một lá bài nữa thì thì để nhận được một lá Át nữa, xác suất chỉ còn là $ 1/51.$

    Để hiểu rõ hơn, chúng ta xét tiếp các ví dụ nữa.

    Ví dụ 1. Một bình đựng 5 viên bi kích thước và chất liệu giống nhau, chỉ khác nhau về màu sắc. Trong đó có 3 viên bi xanh và 2 viên bi đỏ. Lấy ngẫu nhiên từ bình ra một viên bi ta được viên bi màu xanh, rồi lại lấy ngẫu nhiên ra một viên bi nữa. Tính xác suất để lấy được viên bi đỏ ở lần thứ hai.

    Hướng dẫn. Gọi $ A$ là biến cố: “Lấy được một viên bi đỏ ở lần thứ hai”. Vì một viên bi xanh đã được lấy ra ở lần thứ nhất nên còn lại trong bình 4 viên bi trong đó số viên bi đỏ là 2 và số viên bi xanh cũng là 2. Do đó, xác suất cần tìm là $$ \mathrm{P}(A)=\frac{2}{4}=0{,}5. $$

    Ví dụ 2. Gieo một con xúc xắc cân đối và đồng chất hai lần. Tính xác suất để lần đầu gieo được mặt 1 chấm biết rằng tổng số chấm trong hai lần gieo không vượt quá 3.

    Xác suất có điều kiện - Công thức Bayes 1

    Hướng dẫn. Không gian mẫu là $$ \Omega=\big\{\left(i, j\right): 1\leqslant i, j\leqslant 6\big\}, $$ trong đó cặp số $ \left(i, j\right)$ thể hiện việc lần gieo đầu xuất hiện mặt $ i$ chấm, lần sau xuất hiện mặt $ j$ chấm. Không gian mẫu có tất cả $6\times 6=36$ phần tử.

    Gọi $ A$ là biến cố: “Lần đầu gieo xuất hiện mặt 1 chấm”, $ B$ là biến cố: “Tổng số chấm trong hai lần gieo không vượt quá 3”. Chúng ta dễ dàng liệt kê được các phần tử thuận lợi cho từng biến cố là
    \begin{align}
    A=&\big\{\left(1, 1\right), \left(1, 2\right), \left(1, 3\right), \left(1, 4\right), \left(1, 5\right), \left(1, 6\right)\big\},\\
    B=&\big\{\left(1, 1\right), \left(1, 2\right), \left(2, 1\right)\big\},\\
    AB=&\big\{\left(1, 1\right), \left(1, 2\right)\big\}.
    \end{align}

    Dễ dàng đếm được số phần tử của $A,B,AB$ lần lượt là $6$, $3$, $2$. Do đó, theo định nghĩa cổ điển của xác suất thì ta có

    $$ \mathrm{P}(A)=\frac{6}{36}, \quad \mathrm{P}(B)=\frac{3}{36},\quad \mathrm{P}(AB)=\frac{2}{36} .$$

    Nếu biết rằng $ B$ đã xảy ra thì $ A$ xảy ra khi một trong hai kết quả $ \left(1, 1\right)$ và $ \left(1, 2\right)$ xảy ra. Do đó, xác suất của $ A$ với điều kiện $ B$ là $$ \mathrm{P}(A | B)=\frac{2}{3}. $$ Nhận xét rằng $$ \frac{2}{3}=\frac{{2}/{36}}{{3}/{36}}=\frac{\mathrm{P}(AB)}{\mathrm{P}(B)} $$ hay chính là $$ \mathrm{P}(A | B)=\frac{\mathrm{P}(AB)}{\mathrm{P}(B)}. $$ Từ đó, chúng ta có công thức tính xác suất có điều kiện như sau đây.

    Nếu bài viết hữu ích, bạn có thể  tặng tôi 1 cốc cafe vào số tài khoản Agribank 3205 215 033 513.  Xin cảm ơn!

    1.2. Công thức tính xác suất có điều kiện

    Giả sử số các kết quả đồng khả năng có thể xảy ra khi thực hiện phép thử đó là $ N$, số kết quả thuận lợi cho biến cố $ B$ là $ m$ và số kết quả thuận lợi cho biến cố $ AB$ là $n $.

    Theo định nghĩa cổ điển của xác suất thì $$ \mathrm{P}(B)=\frac{m}{N}, \mathrm{P}(AB)=\frac{n}{N}. $$

    Khi biến cố $ B$ đã xảy ra thì số các kết quả đồng khả năng của phép thử có thể xảy ra đối với biến cố $ A$ là $ m$, trong đó có $ n$ kết quả thuận lợi cho $ A$ xảy ra. Do đó, xác suất của biến cố $ A$ khi biết $ B$ đã xảy ra là
    $$ \mathrm{P}(A | B)=\frac{n}{m}=\frac{n/N}{m/N}=\frac{\mathrm{P}(AB)}{\mathrm{P}(B)}. $$

    Từ đó, chúng ta có công thức tính xác suất có điều kiện như sau:

    Xác suất có điều kiện của biến cố $ A$ với điều kiện $ B$ là một số được ký hiệu là $ \mathrm{P}(A | B)$ xác định bởi công thức $$ \mathrm{P}(A | B)=\frac{\mathrm{P}(AB)}{\mathrm{P}(B)}, \mathrm{P}(B)>0. $$

    Từ định nghĩa trên ta dễ dàng nhận được các tính chất sau của xác suất có điều kiện:

    • $ \mathrm{P}(A | B)\geqslant 0.$
    • $ \mathrm{P}\left(\Omega | B\right)=\mathrm{P}\left(B | B\right)=1.$
    • Nếu $ A_1, A_2,\ldots, A_n$ là các biến cố xung khắc từng đôi một, nghĩa là $ A_iA_j=\varnothing$ với mọi $ i\neq j$, ta có $$ \mathrm{P} \left( \left(\bigcup\limits_{i=1}^{n}A_i \right) \Bigg| B \right)=\sum\limits_{i=1}^{n}\mathrm{P}\left(A_i | B\right). $$

    Ví dụ 3. Gieo đồng thời ba con xúc xắc cân đối đồng chất. Tính xác suất để tổng số chấm xuất hiện trên ba con bằng 8 biết rằng ít nhất có một con xuất hiện mặt 5 chấm.

    Hướng dẫn. Không gian mẫu gồm các phần tử $$ \Omega=\big\{\left(i, j, k\right): 1\leqslant i, j, k\leqslant 6\big\}, $$ trong đó bộ số $ \left(i, j, k\right)$ kí hiệu cho việc “con xúc xắc thứ nhất xuất hiện mặt $ i$ chấm, con xúc xắc thứ hai xuất hiện mặt $ j$ chấm và con xúc xắc thứ ba xuất hiện mặt $ k$ chấm”.

    Gọi $ A$ là biến cố: “Tổng số chấm xuất hiện trên ba con xúc xắc bằng 8”, $ B$ là biến cố: “Ít nhất một con xúc xắc ra 5 chấm”. Ta có $$ \mathrm{P}(A | B)=\frac{\mathrm{P}(AB)}{\mathrm{P}(B)}. $$

    Vì $ B$ là biến cố: “Ít nhất một con xúc xắc xuất hiện mặt 5 chấm” nên $ \overline{B}$ là biến cố: “Không có con xúc xắc nào xuất hiện mặt 5 chấm”, do đó $$ \overline{B}=\big\{\left(i, j, k\right): 1\leqslant i, j, k\leqslant 6, i, j, k\neq 5\big\}. $$

    Suy ra $$ \mathrm{P}(\overline{B})=\frac{|\overline{B}|}{|\Omega|}=\frac{5^3}{6^3}. $$

    Do đó $$ \mathrm{P}(B)=1-\mathrm{P}(\overline{B})=1-\frac{5^3}{6^3}=\frac{91}{216}. $$

    Ta thấy $ AB$ là biến cố: “Tổng số chấm xuất hiện trên ba con xúc xắc bằng 8 và ít nhất một con xúc xắc ra 5 chấm”, do đó $$ AB=\big\{\left(1, 2, 5\right), \left(1, 5, 2\right), \left(2, 1, 5\right), \left(2, 5, 1\right), \left(5, 1, 2\right),\left(5, 2, 1\right)\big\}. $$

    Suy ra $$ \mathrm{P}(AB)=\frac{|AB|}{|\Omega|}=\frac{15}{6^3}=\frac{15}{216}. $$

    Vậy xác suất cần tìm là $$ \mathrm{P}(A | B)=\frac{\mathrm{P}(AB)}{\mathrm{P}(B)}=\frac{{15}/{216}}{{91}/{216}}=\frac{15}{91}. $$

    Ví dụ 4. Một gia đình có 2 đứa trẻ. Biết rằng có ít nhất 1 đứa trẻ là con gái. Hỏi xác suất 2 đứa trẻ đều là con gái là bao nhiêu?

    Hướng dẫn. Chúng ta có các nhận xét sau:

    • Xác suất để một đứa trẻ là trai hoặc gái là bằng nhau và bằng $ 1/2$.
    • Giới tính cả 2 đứa trẻ là ngẫu nhiên và không liên quan đến nhau.

    Lời giải. Do gia đình có 2 đứa trẻ nên sẽ có thể xảy ra 4 khả năng:

    (trai, trai), (gái, gái), (gái, trai), (trai, gái).

    Gọi $ A$ là biến cố “Cả hai đứa trẻ đều là con gái” và $ B$ là biến cố “Có ít nhất một đứa trẻ là con gái” thì có $$ \mathrm{P}(A)=\frac{1}{4},\quad \mathrm{P}(B)=\frac{3}{4}. $$
    Do nếu xảy ra $ A$ thì đương nhiên sẽ xảy ra $ B$ nên ta có: $$ \mathrm{P}(AB) = \mathrm{P}(A) =\frac{1}{4}. $$
    Suy ra, xác suất để cả hai đứa trẻ đều là con gái khi biết ít nhất có một đứa trẻ là gái là
    $$\mathrm{P}(A | B) = \dfrac{\mathrm{P}\left(A,B\right)}{\mathrm{P}(B)} = \dfrac{{1}/{4}}{{3}/{4}} = \frac{1}{3}.$$
    Bằng trực quan ta cũng có thể nhìn ra xác suất này. Khi biết một đứa trẻ là gái, giới tính của 2 đứa trẻ sẽ có 3 khả năng: (trai, gái), (gái, trai), (gái, gái).

    Ví dụ 5. Một hộp chứa 8 bi trắng, 2 bi đỏ. Lần lượt bốc từng bi. Giả sử lần đầu tiên bốc được bi trắng. Xác định xác suất
    lần thứ 2 bốc được bi đỏ.

    Hướng dẫn. Gọi $ B$ là biến cố lần 1 bốc được bi trắng, $ A$ là biến cố lần 2 bốc được bi đỏ. Xác suất lần 2 bốc được bi đỏ khi lần 1 đã bốc được bi trắng là $$ \mathrm{P}(A | B)=\frac{\mathrm{P}(AB)}{\mathrm{P}(B)}=\frac{8/10\times 2/9}{8/10}=\frac{2}{9}. $$

    2. Công thức nhân xác suất

    2.1. Công thức nhân xác suất

    Từ công thức tính xác suất có điều kiện $$ \mathrm{P}(A | B)=\frac{\mathrm{P}(AB)}{\mathrm{P}(B)}, \quad \mathrm{P}(B|A)=\frac{\mathrm{P}(AB)}{\mathrm{P}(A)},$$ ta suy ra công thức nhân xác suất $$ \mathrm{P}(AB)=\mathrm{P}(B)\mathrm{P}(A | B)=\mathrm{P}(A)\mathrm{P}\left(B | A\right), $$ với $ \mathrm{P}(A)>0{,} \mathrm{P}(B)>0$.

    Công thức nhân xác suất sử dụng trong một số trường hợp, khi mà chúng ta có thể biết ngay xác suất $ \mathrm{P}\left(B | A\right)$ hoặc $ \mathrm{P}(A | B)$ thì sẽ tính được xác suất $ \mathrm{P}(AB)$.

    Ví dụ 1. Trong hộp có 20 nắp chai bia Tiger, trong đó có 2 nắp ghi “Chúc mừng bạn đã trúng thưởng”. Bạn được chọn lên rút thăm lần lượt hai nắp chai bia, tính xác suất để cả hai nắp đều trúng thưởng.

    Hướng dẫn. Gọi $ A$ là biến cố “nắp chai bia thứ nhất trúng thưởng”, $ B$ là biến cố “nắp chai bia thứ hai trúng thưởng”, $ C$ là biến cố “cả 2 nắp đều trúng thưởng”.

    Khi bạn rút thăm lần đầu thì trong hộp có 20 nắp trong đó có 2 nắp trúng nên $$ \mathrm{P}(A)=\frac{2}{20}. $$

    Khi biến cố $ A$ đã xảy ra thì còn lại 19 nắp trong đó có 1 nắp trúng thưởng. Do đó $$ \mathrm{P}\left(B/A\right) = \frac{1}{19}. $$
    Suy ra, xác suất để cả hai nắp đều trúng thưởng là $$ \mathrm{P}\left(C\right) = \mathrm{P}(A). \mathrm{P}\left(B/A\right) = \frac{2/20}{1/19} = \frac{1}{190} \approx 0{,}0053. $$

    Ví dụ 2. Một bình đựng 5 viên bi kích thước, chất liệu như nhau, trong đó có 3 viên bi xanh và 2 viên bi trắng. Lấy ngẫu nhiên ra một viên bi, rồi lại lấy ngẫu nhiên ra một viên bi nữa. Tính xác suất để lấy được một viên bi xanh ở lần thứ nhất và một viên bi trắng ở lần thứ hai.

    Hướng dẫn. Gọi $ A$ là biến cố: “Lấy được một viên bi xanh ở lần thứ nhất”, $ B$ là biến cố: “Lấy được một viên bi trắng ở lần thứ hai”. Chúng ta cần tính xác suất $ \mathrm{P}(AB)$.

    Theo công thức nhân xác suất $$ \mathrm{P}(AB)=\mathrm{P}(A)\mathrm{P}\left(B | A\right). $$
    Vì có 3 viên bi xanh trong tổng số 5 viên bi nên $$ \mathrm{P}(A)=\frac{3}{5}=0{,}6. $$
    Nếu $ A$ đã xảy ra, tức là một viên bi xanh đã được lấy ra ở lần thứ nhất, thì còn lại trong bình 4 viên bi trong đó số viên bi trắng là 2, do đó $$ \mathrm{P}\left(B | A\right)=\frac{2}{4}=0{,}5. $$
    Vậy xác suất cần tìm là $$ \mathrm{P}(AB)=\mathrm{P}(A)\mathrm{P}\left(B | A\right)=0{,}6\times 0{,}5=0{,}3. $$

    2.2. Công thức nhân xác suất tổng quát

    Bằng phương pháp quy nạp, ta có công thức nhân xác suất tổng quát sau:

    Giả sử $ n\geqslant 2$ và $ A_1, A_2,\ldots, A_n$ là các biến cố sao cho $ \mathrm{P}\left(A_1A_2\ldots A_{n-1}\right)>0$. Khi đó ta có $$ \mathrm{P}\left(A_1A_2\ldots A_{n}\right)=\mathrm{P}\left(A_1\right)\mathrm{P}\left(A_2 | A_1\right)\mathrm{P}\left(A_3 | A_1A_2\right)\ldots\mathrm{P}\left(A_n | A_1A_2\ldots A_{n-1}\right). $$

    Ví dụ 3. Một thủ kho có một chùm chìa khóa gồm 9 chiếc bề ngoài giống hệt nhau trong đó chỉ có hai chiếc mở được cửa kho. Anh ta thử ngẫu nhiên từng chìa (chìa nào không đúng thì bỏ ra khỏi chùm chìa khóa). Tìm xác suất để lần thử thứ ba thì anh ta mới mở được cửa.

    Hướng dẫn. Gọi $ A_1$ là biến cố: “Không mở được cửa ở lần thử thứ 1”, $ A_2$ là biến cố: “Không mở được cửa ở lần thử thứ 2” và $ A_3$ là biến cố: “Mở được cửa ở lần thử thứ 3”. Ta phải tìm $ \mathrm{P}\left(A_1A_2A_3\right)$. Theo công thức nhân xác suất ta có $$ \mathrm{P}\left(A_1A_2A_3\right)=\mathrm{P}\left(A_1\right)\mathrm{P}\left(A_2|A_1\right)\mathrm{P}\left(A_3|A_1A_2\right). $$

    Ta có $$ \mathrm{P}\left(A_1\right)=\frac{7}{9}, \mathrm{P}\left(A_2|A_1\right)=\frac{6}{8}, \mathrm{P}\left(A_3|A_1A_2\right)=\frac{2}{7}. $$

    Do đó $$ \mathrm{P}\left(A_1A_2A_3\right)=\frac{7}{9}\times\frac{6}{8}\times\frac{2}{7}=\frac{1}{6}. $$

    Ví dụ 4. Một người săn thỏ trong rừng, khả năng anh ta bắn trúng thỏ trong mỗi lần bắn tỷ lệ nghịch với khoảng cách bắn. Anh ta bắn lần đầu ở khoảng cách 20 m với xác suất trúng thỏ là 0,5, nếu bị trượt anh ta bắn viên thứ 2 ở khoảng cách 30 m, nếu lại trượt anh ta bắn viên thứ 3 ở khoảng cách 50 m. Tính xác suất để người thợ săn bắn được thỏ.

    Hướng dẫn. Gọi $ A_k$ là biến cố “Người thợ săn bắn trúng thỏ ở lần thứ $ k$” với $ k=1,2,3.$ Theo đề bài, chúng ta có
    \begin{align}
    \mathrm{P}\left(A_1\right)&=0{,}5,\\
    \mathrm{P}\left(A_2|\overline{A_1}\right)&=\frac{20\times 0{,}5}{30}=\frac{1}{3},\\
    \mathrm{P}\left(A_3|\overline{A_1}.\overline{A_2}\right)&=\frac{20\times 0{,}5}{50}=\frac{1}{5}.
    \end{align}
    Gọi $ A$ là biến cố “Người thợ săn bắn trúng thỏ” thì $$ A=A_1\cup \overline{A_1}A_2\cup \overline{A_1}.\overline{A_2}.A_3. $$
    Vì các biến cố $ A_1, \overline{A_1}A_2, \overline{A_1}.\overline{A_2}.A_3$ xung khắc từng đôi một, nên ta có
    $$ \mathrm{P}(A)=\mathrm{P}\left(A_1\right)+\mathrm{P}\left(\overline{A_1}A_2\right)+\mathrm{P}\left(\overline{A_1}.\overline{A_2}.A_3\right) $$
    Theo công thức nhân xác suất thì
    $$ \mathrm{P}\left(\overline{A_1}A_2\right) = \mathrm{P}\left(\overline{A_1}\right)\mathrm{P}\left(A_2|\overline{A_1}\right)=\left(1-0{,}5\right)\times \mathrm{P}\left(A_2|\overline{A_1}\right)=\frac{1}{6}. $$
    $$ \mathrm{P}\left(\overline{A_1}.\overline{A_2}.A_3\right)= \mathrm{P}\left(\overline{A_1}\right) \mathrm{P}\left(\overline{A_2}|\overline{A_1}\right)\mathrm{P}\left(A_3|\overline{A_1}.\overline{A_2}\right)=\left(1-0{,5}\right)\left(1-\frac{1}{3}\right)\times \frac{1}{5} =\frac{1}{15}.$$
    Do đó, xác suất cần tìm là $$ \mathrm{P}(A)=0{,}5+\frac{1}{6}+\frac{1}{15}=\frac{11}{15}. $$

    3. Công thức xác suất đầy đủ

    3.1. Hệ đầy đủ các biến cố

    Hệ các biến cố $ \big\{B_1, B_2,\ldots, B_n\big\}$ được gọi là đầy đủ nếu thỏa mãn đồng thời hai điều kiện:

    • $ B_1, B_2,\ldots, B_n$ là các biến cố xung khắc từng đôi một, nghĩa là $ B_iB_j=\varnothing$ với mọi $ i\neq j$,
    • $ \Omega=B_1\cup B_2\cup\cdots\cup B_n$.

    Nhận xét rằng, hệ $ \big\{B, \overline{B}\big\}$ là một hệ đầy đủ, trong đó $ B$ là một biến cố bất kỳ.

    3.2. Công thức xác suất đầy đủ

    Giả sử $ \big\{B_1, B_2,\ldots, B_n\big\}$ là hệ đầy đủ các biến cố với $ \mathrm{P}\left(B_i\right)>0,\,\forall i=1,2,\ldots,n$. Khi đó với bất kỳ biến cố $ A$, ta có $$ \mathrm{P}(A)=\mathrm{P}\left(B_1\right)\mathrm{P}\left(A | B_1\right)+\mathrm{P}\left(B_2\right)\mathrm{P}\left(A | B_2\right)+\cdots+\mathrm{P}\left(B_n\right)\mathrm{P}\left(A | B_n\right). $$

    Ví dụ 1. Có 3 hộp giống nhau. Hộp thứ nhất đựng 10 sản phẩm, trong đó có 6 chính phẩm, hộp thứ hai đựng 15 sản phẩm, trong đó có 10 chính phẩm, hộp thứ ba đựng 20 sản phẩm, trong đó có 15 chính phẩm. Lấy ngẫu nhiên một hộp và từ đó lấy ngẫu nhiên một sản phẩm. Tìm xác suất để lấy được chính phẩm.

    Hướng dẫn. Ký hiệu $ B_k$ là biến cố: “Sản phẩm lấy ra thuộc hộp thứ $ k$”, $ k=1, 2, 3$ và $ A$ là biến cố: “Lấy được chính phẩm”. Chúng ta có ngay $ \big\{B_1, B_2, B_3\big\} $là hệ đầy đủ các biến cố và

    • $ \mathrm{P}\left(B_1\right)=\frac{1}{3}, \mathrm{P}\left(B_2\right)=\frac{1}{3}, \mathrm{P}\left(B_3\right)=\frac{1}{3},$
    • $ \mathrm{P}\left(A | B_1\right)=\frac{6}{10}, \mathrm{P}\left(A | B_2\right)=\frac{10}{15}, \mathrm{P}\left(A | B_3\right)=\frac{15}{20}.$

    Theo công thức xác suất đầy đủ $$ \mathrm{P}(A)=\mathrm{P}\left(B_1\right)\mathrm{P}\left(A | B_1\right)+\mathrm{P}\left(B_2\right)\mathrm{P}\left(A | B_2\right)+\mathrm{P}\left(B_3\right)\mathrm{P}\left(A | B_3\right) $$

    Thay các giá trị tính được ở trên vào công thức này ta thu được $$ \mathrm{P}(A)=\frac{1}{3}\times \frac{6}{10}+\frac{1}{3}\times \frac{10}{15}+\frac{1}{3}\times \frac{15}{20}=\frac{31}{45} $$
    Vậy xác suất để lấy được chính phẩm là $ {31}/{45}$.

    Ví dụ 2. Từ một hộp chứa $ m$ quả cầu trắng và $ n$ quả cầu đen, người ta rút ngẫu nhiên không hoàn lại từng quả một hai lần. Tính xác suất để quả lấy lần thứ hai là trắng.

    Hướng dẫn. Ký hiệu $ A$ là biến cố: “Lần thứ hai rút được quả cầu trắng”, $ B_1$ là biến cố: “Lần thứ nhất rút được quả cầu trắng”, $ B_2$ là biến cố: “Lần thứ nhất rút được quả cầu đen”.

    Ta có

    • $ \mathrm{P}\left(B_1\right)=\frac{m}{m+n}, \mathrm{P}\left(B_2\right)=\frac{n}{m+n},$
    • $ \mathrm{P}\left(A|B_1\right)=\frac{m-1}{m+n-1}, \mathrm{P}\left(A|B_2\right)=\frac{m}{m+n-1}.$

    Vì $ \big\{B_1, B_2\big\}$ là một hệ đầy đủ nên theo công thức xác suất đầy đủ, chúng ta có \begin{align}
    \mathrm{P}(A)&=\mathrm{P}\left(B_1\right)\mathrm{P}\left(A|B_1\right)+\mathrm{P}\left(B_2\right)\mathrm{P}\left(A|B_2\right)\\
    =&\frac{m}{m+n}\times\frac{m-1}{m+n-1}+\frac{n}{m+n}\times\frac{m}{m+n-1}\\
    =&\frac{m\left(m-1\right)+mn}{\left(m+n\right)\left(m+n-1\right)}
    =&\frac{m\left(m+n-1\right)}{\left(m+n\right)\left(m+n-1\right)}
    =&\frac{m}{m+n}.
    \end{align}
    Vậy xác suất để quả lấy lần thứ hai là trắng là$ \frac{m}{m+n}$.

    Ví dụ 3. Có 10 chiếc túi đựng bi như sau:

    • 4 túi loại 1, trong mỗi túi loại 1 chứa 6 viên bi trắng và 4 viên bi đen,
    • 2 túi loại 2, trong mỗi túi loại 2 chứa 3 viên bi trắng và 7 viên bi đen,
    • 1 túi loại 3, trong mỗi túi loại 3 chứa 7 viên bi trắng và 3 viên bi đen,
    • 3 túi loại 4, trong mỗi túi loại 4 chứa 4 viên bi trắng và 6 viên bi đen.

    Chọn ngẫu nhiên 1 chiếc túi rồi lấy ngẫu nhiên 2 viên bi. Tính xác suất để lấy được hai viên bi cùng màu.

    Hướng dẫn. Ký hiệu $ B_k$ là biến cố “chọn được túi loại $ k$”, $ k=1, 2, 3, 4$ và $ A$ là biến cố “lấy được hai viên bi cùng màu”.

    Ta có $ \big\{B_1, B_2, B_3, B_4\big\} $ là hệ đầy đủ các biến cố và

    \begin{align}
    \mathrm{P}\left(B_1\right)=\frac{4}{10}, \mathrm{P}\left(B_2\right)=\frac{2}{10},\\
    \mathrm{P}\left(B_3\right)=\frac{1}{10}, \mathrm{P}\left(B_4\right)=\frac{3}{10},\\
    \mathrm{P}\left(A | B_1\right)=\frac{C_6^2+C_4^2}{C_{10}^2}=\frac{21}{45},\mathrm{P}\left(A | B_2\right)=\frac{C_3^2+C_7^2}{C_{10}^2}=\frac{24}{45},\\
    \mathrm{P}\left(A | B_3\right)=\frac{C_7^2+C_3^2}{C_{10}^2}=\frac{24}{45}, \mathrm{P}\left(A | B_4\right)=\frac{C_4^2+C_6^2}{C_{10}^2}=\frac{21}{45}.
    \end{align}

    Theo công thức xác suất đầy đủ
    $$ \mathrm{P}(A)=\mathrm{P}\left(B_1\right)\mathrm{P}\left(A | B_1\right)+\mathrm{P}\left(B_2\right)\mathrm{P}\left(A | B_2\right)+\mathrm{P}\left(B_3\right)\mathrm{P}\left(A | B_3\right)+\mathrm{P}\left(B_4\right)\mathrm{P}\left(A | B_4\right) $$

    Suy ra $$ \mathrm{P}(A)=\frac{4}{10}\times \frac{21}{45}+\frac{2}{10}\times \frac{24}{45}+\frac{1}{10}\times \frac{24}{45}+\frac{3}{10}\times \frac{21}{45} =\frac{219}{450}. $$

    Vậy xác suất cần tìm là $ \frac{219}{450}$.

    Ví dụ 4. Có hai cái hộp. Hộp thứ nhất có 4 bi trắng và 5 bi đen. Hộp thứ hai có 5 bi trắng và 4 bi đen. Chọn ngẫu nhiên 3 viên bi ở hộp thứ nhất bỏ vào hộp thứ hai rồi sau đó chọn ngẫu nhiên một viên bi ở hộp thứ hai ra. Tính xác suất để lấy được bi trắng từ hộp thứ hai.

    Hướng dẫn. Gọi $ A$ là biến cố: “Lấy được bi trắng từ hộp thứ hai”, $ B_k$ là biến cố: “Trong 3 viên bi lấy ra từ hộp thứ nhất có $ k$ bi trắng”, $ k=0, 1, 2, 3$.

    Khi đó $ \big\{B_0{,} B_1, B_1, B_3\big\} $ là hệ đầy đủ các biến cố và ta có
    \begin{align}
    \mathrm{P}\left(B_0\right)&=\frac{C_5^3}{C_9^3}=\frac{10}{84},\\
    \mathrm{P}\left(B_1\right)&=\frac{C_4^1C_5^2}{C_9^3}=\frac{40}{84},\\
    \mathrm{P}\left(B_2\right)&=\frac{C_4^2C_5^1}{C_9^3}=\frac{30}{84},\\
    \mathrm{P}\left(B_3\right)&=\frac{C_4^3}{C_9^3}=\frac{4}{84}.
    \end{align}

    Theo công thức xác suất đầy đủ
    $$ \mathrm{P}(A)=\mathrm{P}\left(B_0\right)\mathrm{P}\left(A | B_0\right)+\mathrm{P}\left(B_1\right)\mathrm{P}\left(A | B_1\right)+\mathrm{P}\left(B_2\right)\mathrm{P}\left(A | B_2\right)+\mathrm{P}\left(B_3\right)\mathrm{P}\left(A | B_3\right). $$

    Dễ thấy
    \begin{align}
    \mathrm{P}\left(A | B_0\right)=\frac{5}{12},\quad & \mathrm{P}\left(A | B_1\right)=\frac{6}{12},\\
    \mathrm{P}\left(A | B_2\right)=\frac{7}{12},\quad & \mathrm{P}\left(A | B_3\right)=\frac{8}{12}.
    \end{align}

    Thay các giá trị này vào công thức xác suất đầy đủ ta được $$ \mathrm{P}(A)=\frac{10}{84}\times\frac{5}{12}+\frac{40}{84}\times\frac{6}{12}+\frac{30}{84}\times\frac{7}{12}+\frac{4}{84}\times\frac{8}{12} =\frac{532}{1008} =\frac{19}{36}. $$

    Vậy xác suất cần tìm là $ {19}/{36}$.

    Ví dụ 5. Trong một cái hộp có $ n$ sản phẩm, ta bỏ vào cái hộp đó một sản phẩm tốt sau đó lấy ngẫu nhiên ra một sản phẩm. Tính xác suất để sản phẩm lấy ra là tốt nếu mọi giả thiết về trạng thái cấu thành ban đầu của hộp là đồng xác suất.

    Hướng dẫn. Gọi $ A$ là biến cố: “Lấy được sản phẩm tốt”, $ B_i$ là biến cố: “Lúc ban đầu hộp có $ i$ sản phẩm tốt”, $ i=0,1,\ldots,n$. Khi đó $ \big\{B_0{,} B_1,\ldots, B_n\big\} $ là hệ đầy đủ các biến cố.

    Theo giả thiết $$ \mathrm{P}\left(B_i\right)=\frac{1}{n+1}, i=0,1,\ldots,n.$$

    Ta có $ \mathrm{P}\left(A | B_i\right)=\frac{i+1}{n+1}$ với mọi $ i=0,1,\ldots,n$. Theo công thức xác suất đầy đủ

    $$ \mathrm{P}(A)=\sum\limits_{i=0}^{n}\mathrm{P}\left(B_i\right)\mathrm{P}\left(A | B_i\right). $$

    Thay vào ta được
    \begin{align}
    \mathrm{P}(A)&=\sum\limits_{i=0}^{n}\frac{i+1}{\left(n+1\right)^2}\\
    &=\frac{1+2+\cdots+\left(n+1\right)}{\left(n+1\right)^2}\\
    &=\frac{\left(n+1\right)\left(n+2\right)}{2\left(n+1\right)^2}\\
    &=\frac{n+2}{2\left(n+1\right)}.
    \end{align}

    4. Công thức Bayes – Định lý Bayes

    Giả sử $ \mathrm{P}(A)>0$ và $ \big\{B_1, B_2,\ldots, B_n\big\} $ là hệ đầy đủ các biến cố với $ \mathrm{P}\left(B_k\right)>0$ với mọi $ k=1,2,\ldots,n$. Khi đó với mọi $ k=1,2,\ldots,n$, ta có $$ \mathrm{P}\left(B_k | A\right)=\frac{\mathrm{P}\left(B_k\right)\mathrm{P}\left(A | B_k\right)}{\mathrm{P}\left(B_1\right)\mathrm{P}\left(A | B_1\right)+\mathrm{P}\left(B_2\right)\mathrm{P}\left(A | B_2\right)+\cdots+\mathrm{P}\left(B_n\right)\mathrm{P}\left(A | B_n\right)}. $$

    Ví dụ 1. Dây chuyền lắp ráp nhận được các chi tiết do hai máy sản xuất. Trung bình máy thứ nhất cung cấp 60% chi tiết, máy thứ hai cung cấp 40% chi tiết. Khoảng 90% chi tiết do máy thứ nhất sản xuất là đạt tiêu chuẩn, còn 85% chi tiết do máy thứ hai sản xuất là đạt tiêu chuẩn. Lấy ngẫu nhiên từ dây chuyền một sản phẩm, thấy nó đạt tiêu chuẩn. Tìm xác suất để sản phẩm đó do máy thứ nhất sản xuất.

    Hướng dẫn. Gọi $ A$ là biến cố: “Chi tiết lấy từ dây chuyền đạt tiêu chuẩn”, $ B_1$ là biến cố: “Chi tiết do máy thứ nhất sản xuất” và $ B_2$ là biến cố: “Chi tiết do máy thứ hai sản xuất”. Ta cần tính xác suất $ \mathrm{P}\left(B_1|A\right)$.

    Theo công thức Bayes $$ \mathrm{P}\left(B_1|A\right)=\frac{\mathrm{P}\left(B_1\right)\mathrm{P}\left(A|B_1\right)}{\mathrm{P}\left(B_1\right)\mathrm{P}\left(A|B_1\right)+\mathrm{P}\left(B_2\right)\mathrm{P}\left(A|B_2\right)}. $$

    Theo điều kiện bài toán $$ \mathrm{P}(B_1)=0{,}6; \mathrm{P}(B_2)=0{,}4; $$
    $$ \mathrm{P}(A|B_1)=0{,}9; \mathrm{P}(A|B_2)=0{,}85. $$

    Thay vào ta có $$ \mathrm{P}\left(B_1|A\right)=\frac{0{,}6\times 0{,}9}{0{,}6\times 0{,}9+0{,}4\times 0{,}85}=0{,}614. $$

    Sau đây là một bài toán khá nổi tiếng trong xác suất thống kê, được giải theo nhiều cách khác nhau. Ta hãy thử giải bài toán này bằng định lý Bayes.
    Ví dụ 2.[Bài toán Tuesday Child] Một gia đình có hai đứa trẻ. Biết có ít nhất có một đứa trẻ là con gái và sinh vào thứ 3. Hỏi xác suất 2 đứa trẻ đều là con gái là bao nhiêu?

    Hướng dẫn. Chúng ta có nhận xét sau:

    • Xác suất để một đứa trẻ sinh vào một ngày nhất định trong tuần là $ 1/7$.
    • Giới tính của đứa trẻ và ngày sinh của nó là 2 sự kiện không liên quan đến nhau.

    Ta ký hiệu các biến cố như sau:

    • $ B$ là biến cố “Ít nhất 1 đứa trẻ là con gái sinh ra vào thứ 3”,
    • $ A$ là biến cố “Cả 2 đứa trẻ đều là con gái”, xác suất là $ \mathrm{P}(A)=1/4$,
    • $ A_1$ là biến cố “Chỉ một trong 2 đứa trẻ là con gái”, $ \mathrm{P}(A_1)=1/2$,
    • $ C $ là biến cố “Đứa trẻ sinh ra vào thứ 3”, $ \mathrm{P}(C)=1/7$,
    • $ \overline{C} $ là biến cố “Đứa trẻ sinh ra vào thứ 3”, $ \mathrm{P}(\overline{C})=6/7$.

    Để sử dụng định lý Bayes tính $ \mathrm{P}(A | B)$ ta cần tính được $ \mathrm{P}(B|A)$ và $ \mathrm{P}(B)$.

    $ \mathrm{P}(B|A)$ được hiểu là xác suất ít nhất 1 đứa trẻ là con gái sinh ra vào thứ 3 nếu biết trước 2 đứa trẻ là con gái.
    Ta sẽ tính xác suất phần bù $ \mathrm{P}(\overline{B}|A)$, đây là xác suất để không có đứa trẻ nào sinh ra vào thứ 3.
    $$ \mathrm{P}(\overline{B}|A) = \mathrm{P}(\overline{C}) \mathrm{P}(\overline{C}) = \dfrac{6}{7} \times \dfrac{6}{7} = \dfrac{36}{49} $$
    Như vậy ta có
    $$ \mathrm{P}(B|A) = 1 – \mathrm{P}(\overline{B}|A) = \dfrac{13}{49} $$
    $ \mathrm{P}(B)$ là xác suất sự ít nhất 1 đứa trẻ là con gái sinh ra vào thứ 3. Sự kiện này bao gồm 2 khả năng:

    • Cả 2 đứa trẻ đều là con gái $ A$,
    • Chỉ 1 đứa trẻ là con gái $ A_1$.

    Ta có \begin{align}
    \mathrm{P}(B) &= \mathrm{P}(BA) + \mathrm{P}(BA_1) \\
    &= \mathrm{P}(B|A)\mathrm{P}(A) + \mathrm{P}(B|A_1)\mathrm{P}(A_1)\\
    &= \dfrac{13}{49} \times \dfrac{1}{4} + \dfrac{1}{7} \times \dfrac{1}{2}\\
    &=\dfrac{27}{196}
    \end{align}

    Thay vào định lý Bayes, ta tính được
    $$ \mathrm{P}(A | B) = \dfrac{\mathrm{P}(B|A)\times \mathrm{P}(A)}{\mathrm{P}(B)} = \dfrac{\tfrac{13}{49} \times \tfrac{1}{4}}{\tfrac{27}{196}} = \dfrac{13}{27} \approx 0{,}481 $$
    Chúng ta có thể minh họa bằng hình vẽ sau đây, xác suất cần tìm chính bằng số ô màu xanh chia cho tổng số ô màu vàng và xanh.

    Ta dùng một đoạn code Python nho nhỏ để kiểm tra thử kết quả vừa tính được.

    import random
    
    def random_kid():
       gender = random.choice(["boy", "girl"])
       birth_date = random.choice(["mon", "tue", "wed", "thu", "fri", "sat", "sun"])
       return (gender, birth_date)
    
    both_girls = 0
    tuesday_girl = 0
    
    random.seed(0)
    total = 100000
    for _ in range(total):
       first_child = random_kid()
       second_child = random_kid()
    
    if first_child == ("girl", "tue") or second_child == ("girl", "tue"):
       tuesday_girl += 1
    if first_child[0] == "girl" and second_child[0] == "girl":
       both_girls += 1
    
    print("both_girls = ", both_girls)
    print("tuesday_girl = ", tuesday_girl)
    print("P(both_girls|tuesday_girl) = ", both_girls / tuesday_girl)

    Đoạn code trên thực hiện random 100K dữ liệu. Thu được kết quả in ra như sau

    both_girls = 6506
    tuesday_girl = 13637
    P(both_girls|tuesday_girl) = 0.4770844027278727

    Xác suất tính ra tương đối sát với con số ta tính bằng định lý Bayes ở trên.

    Bài viết tổng hợp từ https://1upnote.me/post/2018/11/ds-ml-bayes-theorem/ và https://math4rum.wordpress.com/2013/04/01/bai-1-5-cong-thuc-xac-suat-day-du-cong-thuc-bayes/

  • 49 bài toán lớp 4 thử thách trí thông minh

    49 bài toán lớp 4 thử thách trí thông minh

    49 BÀI TOÁN LỚP 4

    O2 Education xin giới thiệu 54 bài toán lớp 4, các dạng toán đố, thử thách trí thông minh, toán suy luận dành cho HSG lớp 4. Các bài toán có lời giải được chúng tôi sưu tầm từ nhiều nguồn khác nhau.

    Bài 1: GIỎI CẢ HAI MÔN

    Lớp 4A có 42 học sinh. Trong đó có 25 HS giỏi toán, 23 HS giỏi Tiếng Việt và hai HS không giỏi môn nào. Hỏi có bao nhiêu HS giỏi cả hai môn?

    Hướng dẫn.

    Số HS giỏi ít nhất 1 môn là:

    42 – 2 = 40 (HS)

    Số HS giỏi cả hai môn là:

    (25 + 23) – 40 = 8 (HS)

    Đáp số: 8 HS.

    Bài 2: MÀU ÁO VÀ MÀU NƠ

    Ba bạn Hiền, Thi, Thoa mặc ba chiếu áo màu đỏ, vàng, xanh và cài ba cái nơ cũng màu đỏ, vàng, xanh.

    Biết rằng:

    1. Thoa cài nơ màu xanh.
    2. Chỉ có bạn Hiền là có màu áo và màu nơ giống nhau.
    3. Màu áo và màu nơ của Thi đều không phải màu đỏ.

    Hãy xác định xem ba bạn Hiền, Thi, Thoa mặc áo màu gì và cài nơ màu gì?

    Hướng dẫn.

    Từ a) và b) có màu áo của Thoa là đỏ hoặc vàng.

    Từ c) có màu nơ, màu áo của Thi là xanh hoặc vàng. Suy ra:

    • Màu áo của Thoa là màu vàng.
    • Màu áo và màu nơ của Hiền là màu đỏ. Còn lại Thi có áo màu xanh và nơ màu vàng.

    Đáp số:

    • Hiền mặc áo đỏ, cài nơ đỏ.
    • Thi mặc áo xanh, cài nơ vàng.
    • Thoa mặc áo vàng, cài nơ xanh.

    Bài 3: NGƯỜI LÁI THUYỀN THÔNG MINH

    Trên một dòng sông, có một người lái thuyền phải chở một con sói, một con dê và một chiếc bắp cải sang sông. Khó một nỗi là thuyền của bác nhỏ nên mỗi chuyến chỉ chở được một con sói, hoặc một con dê, hoặc một bắp cải. Nhưng nếu chó sói đứng cạnh dê thì chó sói sẽ ăn thịt dê, mà dê đứng cạnh bắp cải thì dê sẽ ăn bắp cải.

    Làm thế nào bay giờ? Bác lái thuyền suy nghĩ một lúc rồi bác reo lên: “Ta đã có cách.” Và rồi bác đã hoàn thành công việc thật xuất sắc.

    Đố bạn biết bác đã làm thế nào?

    bài toán 4 logic câu đố bài toán qua sông

    Hướng dẫn.

    Bác lái thuyền đã chở được cả sói, dê và bắp cải sang sông bằng cách:

    • Lần thứ nhất: Bác chở dê sang sông để sói và bắp cải ở lại vì sói không ăn bắp cải. Bác quay thuyền trở về.
    • Lần thứ hai: Bác chở sói sang sông nhưng khi đưa sói lên bờ đồng thời bác lại cho dê xuống thuyền về bên kia vì nếu để dê lại thì dê sẽ là miếng mồi ngon của sói.
    • Lần thứ ba: Bác chở bắp cải sang sông. Như vậy sói và bắp cải đã sang sông. Bác quay trở về bến cũ nơi có chú dê đang đợi.
    • Lần thứ tư: Bác chở nốt chú dê sang sông.

    Sau bốn lần, bác lái thuyền đã chở được sói, bắp cải và dê sang sông một cách an toàn. Đúng là một bác lái thuyền thông minh.

    Bài 4: AI LÀM HOA GÌ?

    Ba bạn Cúc, Đào, Hồng làm ba hoa giấy, hoa cúc, hoa đào, hoa hồng. Bạn làm hoa hồng nói với Cúc: thế là trong chúng ta không có ai làm hoa trùng với tên của mình.

    Các bạn thử đoán xem ai làm hoa gì?

    Hướng dẫn.

    • Bạn làm hoa hồng nói với Cúc nên Cúc không làm hoa hồng. Cúc không làm hoa trùng tên của mình nên Cúc không làm hoa cúc. Vậy Cúc làm hoa đào.
    • Bạn hồng không làm hoa đào vì hoa đào là bạn Cúc làm, Hồng không làm hoa trùng tên của mình nên Hồng không làm hoa hồng. Vậy Hồng làm hoa cúc.
    • Cuối cùng Đào làm hoa hồng.

    Bài 5: CÓ MẤY NGƯỜI CON?

    Ở một bản làng nọ có một gia đình có ba người con trai. Mỗi người con trai đều có một người chị gái và một người em gái.

    Cái bạn thử đoán xem gia đình đó có mấy người?

    Hướng dẫn.

    • Gia đình đó có một người con gái là con gái là con cả để ba người con trai đó có một chị gái.
    • Gia đình đó phải có một người con gái là con út để ba người con trai có một em gái.
    • Vậy gia đình đó có tổng số người con là: 1 + 3 + 1 = 5 (người con)

    Đáp số: 5 người con.

    Bài 6: LẤY ÍT NHẤT BAO NHIÊU?

    Trong hộp có 45 quả bóng gồm 20 màu đỏ, 15 quả màu xanh và 10 quả màu vàng. Hỏi phải lấy ra bao nhiêu quả bóng để chắc chắn có ba quả bóng:

    a) Màu đỏ.

    b) Cùng màu.

    c) Khác màu

    Hướng dẫn.

    a) Hộp đó có tất cả số bong xanh và vàng là: 15 + 10 = 25 (quả)

    Nếu lấy ra 25 quả bóng thì chưa chắc trong đó đã có bóng màu đỏ. Vậy mướn có chắc chắn 3 quả bóng màu đỏ được lấy ra thì ta phải lấy ít nhất số quả bóng là: 25 + 3 = 28 (quả)

    b) Số bóng trong hộp chỉ có ba màu đỏ, xanh và vàng nên nếu lấy ít nhất 7 quả thì chắc chắn sẽ có ba quả cùng màu.

    c) Hộp đó có tất cả số bóng đỏ và xanh là: 20 + 15 = 35 (quả)

    Nếu lấy ra 35 quả thì chưa chắc trong đó đã có bóng vàng. Vậy muốn chắc chắn có 3 quả bóng khác màu thì ta phải lấy ít nhất số quả bóng là: 35 + 1 = 36(quả)

    Đáp số: a) 28 quả. b) 7 quả. c) 36 quả.

    Bài 7: BỐN KHÁCH DU LỊCH

    Có bốn người cùng đi du lịch đến Pháp. Một người biết tiếng Pháp và tiếng Anh. Một người biết tiếng Đức và tiếng Nhật. Một người biết tiếng Nhật và tiếng Anh, còn người cuối cùng biết tiếng Trung Quốc và tiếng Đức. Cả bốn người họ cùng thuê phòng ở một khách sạn. Đến cửa khách sạn họ nhìn thấy một bảng thông báo.

    Làm thế nào để mọi người đều hiểu nội dung bảng thông báo được nhỉ? Chúng ta cùng nghĩ xem nhé.

    Hướng dẫn.

    • Nếu cả 4 người khách đều ở cùng một nước thì thật đơn giản. Người biết tiếng Pháp và tiếng Anh sẽ dịch bảng thông báo này ra thứ tiếng của nước mà họ ở. Khi đó cả 4 người đều hiểu nội dung bảng thông báo.
    • Nếu cả 4 người khách không phải là người cùng một nước thì ta giải quyết như sau:
      • Người biết tiếng Pháp và tiếng Anh sẽ dịch bảng thông báo này sang tiếng Anh để người biết tiếng Anh và tiếng Nhật hiểu.
      • Sau đó người biết tiếng Anh và tiếng Nhật sẽ dịch bảng bảng thông báo này sang tiếng Nhật để người biết tiếng Nhật và tiếng Đức hiểu.
      • Cuối cùng người biết tiếng Nhật và tiếng Đức sẽ dịch bảng bảng thông báo này sang tiếng Đức để người biết tiếng Đức và tiếng Trung Quốc hiểu.

    Như vậy là cả 4 người đều hiểu nội dung bảng thông báo.

    Bài 8: CÓ BAO NHIÊU CÁCH CHỌN?

    Có 8 người đăng kí tham gia trò chơi VUI ĐỂ HỌC trên đài truyền hình. Ban tổ chức muốn chọn ba người vào một vòng chơi.

    Đố các bạn có bao nhiêu cách chọn?

    Hướng dẫn.

    • Người thứ nhất có 8 cách chọn. Còn lại 7 người.
    • Người thứ hai có 7 cách chọn. Còn lại 6 người.
    • Người thứ ba có 6 cách chọn.
    • Cách chọn 3 người ABC cũng là ACB,BAC, BCA, CAB, CBA.
    • Sáu cách chọn trên chỉ là một cách. Do đó ta có số cách chọ là: (8 x 7 x 6) : 6 = 56 (cách chọn)

    Đáp số: 56 cách chọn.

    Bài 9: DŨNG ĐÚNG HAY TRÍ ĐÚNG?

    • Trường Tiểu học M tổ chức thi đấu bóng bàn, có 11 đấu thủ tham gia.
    • Dũng nói rằng: “Có thời điểm mỗi đấu thủ đều đấu đung 7 trận”
    • Trí nói rằng: “Dũng nói sai rồi”.
    • Dũng đúng hay Trí đúng? Các bạn hãy nghĩ xem!

    Hướng dẫn.

    Nếu mỗi đấu thủ đấu đúng 7 trận thì số trận đẫ đấu của giải là: (7 x 11 ) : 2 = 38,5 không phải là số tự nhiên.

    Vậy không có lúc nào mỗi đấu thủ đều đấu đúng 7 trận. Dũng nói sai. Trí nói đúng!

    Bài 10: BA ĐÔI VỚ

    Trong thùng có ba đôi vớ (bít tất) để lẫn lộn. Bạn Mai lấy ra 4 chiếc vớ.

    Hỏi có thể nói chắc chắn rằng trong 4 chiếc vớ bạn Mai vừa lấy ra có ít nhất 2 chiếc vớ cùng một đôi được không?

    Hướng dẫn.

    Số chiếc vớ có là: 2 x 3 = 6 (chiếc)

    Lấy ra 4 chiếc còn lại 2 chiếc. 2 chiếc vớ còn lại này của cùng một đôi hoặc hai đôi khác nhau. Do đó 4 chiếc vớ lấy ra phải có ít nhât 2 chiếc vớ của cùng một đôi.

    Bài 11: NƯỚNG CÁ

    Chị Trinh giúp mẹ nướng cá trên lò nướng. Cần phải nướng chín 3 con cá. Biết rằng : để nướng chín một con cá thì cần 4 phút và lò nướng chỉ có thể nướng được 2 con cá một lần.

    Chị Trinh cần ít nhất bao nhiêu phút để nướng chín 3 con cá này?

    Hướng dẫn.

    Chị Trinh cần ít nhất 6 phút để nướng hết số cá.

    Chị Trinh có thể nướng như sau:

    Con cá thứ nhất và thứ hai cùng nướng trong 2 phút, trở mặt dưới của con cá thứ nhất lên, đặt con cá thứ hai lên trên con cá thứ nhất và đặt con cá thứ ba vào lò nướng, nướng trong 2 phút con cá thứ nhất đã chín, lấy ra ngoài, trở mặt chưa nướng của con cá thứ hai và thứ ba xuống nướng trong 2 phút chín hai con cá này!

    Bài 12: BỐN SỐ KÌ DIỆU

    Anh Hai đố Bình viết lên bảng con, bốn số chẵn có ba chữ số mà sau khi xoay ngược bảng từ dưới lên trên thì vẫn được những số ấy. Bình loay hoay mãi không nổi một số. Các bạn hãy giúp Bình tìm ra bốn số kì diệu đó nhé!

    Hướng dẫn.

    • Trong mười chữ số chỉ có bốn chỉ có bốn chữ số 0 ; 6 ; 8 ; 9 là khi viết vào bảng con rồi xoay ngược bảng từ dưới lên trên vẫn đọc được.
    • Từ bốn số trên ta viết được bốn số chẵn có ba chữ số mà sau khi xoay ngược bảng từ dưới lên trên thì vẫn được chính số đó là:
    • 808 ; 888 ; 906 ; 986.
    • Bình hãy viết từng số lên bảng rồi làm đúng yêu càu của anh Hai xem nhé. Bình thấy chúng mình “siêu” chưa?

    Bài 13: SAO LẠI THẾ ?

    Cô giáo có ba tấm bìa nhỏ hình vuông, trên mỗi tấm bìa có ghi một chữ số. Cô đưa cả ba tấm bìa cho Tý và yêu cầu Tý tính tổng. Tý tìm ra kết quả là 22. Cô đưa lại ba tấm bìa đó cho Tèo và yêu cầu Tèo tính tổng. Tèo lại tìm ra kết quả là 25. Tuy nhiên cô giáo vẫn khen cả hai bạn tính đúng. Các bạn ơi ! Tại sao thế nhỉ?

    Hướng dẫn.

    Cô giáo khẳng định kết quả của cả Tý và Tèo đều đúng nên chắc chắn ba số ở ba tấm bìa sẽ có ít nhất một số một bạn đã so được với số của ban kia.

    Vì 25 – 22 = 3 nên sau khi xoay ngược só đó đã tăng lên hoặc giảm đi ba đơn vị. trong các chữ số khi xoay ngược vẫn đọc được chỉ có số 9 và số 6 hơn kém nhau 3 đơn vị. Ta có:

    8 + 8 + 6 = 22 và 8 + 8 + 9 = 25

    Do đó phép tính của Tý là 8 + 8 + 6 = 22 và Tèo đã xoay ngược số 6 thành số 9 nên phép tính của Tèo là 8 + 8 + 9 = 25

    Bài 14: TÍCH CÁC CHỮ SỐ

    Tuấn Anh cùng mẹ đến siêu thị sách. Tuấn Anh dừng chân tại khu sách tham khảo dành cho Tiểu học. Em cầm trên tay cuốn: “VUI HỌC TOÁN 4” và say sưa đọc các bài toán vui. Biết con mình thích cuốn sách này nên mẹ mua ngay cho Tuấn Anh. Nhìn vào tên cuốn sách mẹ chợt nảy ra một bài toán đố Tuấn Anh:

    “Nếu thay mỗi chữ cái bởi một chữ số, chữ cái giống nhau được thay bởi những số giống nhau, chữ cái khác nhau được thay bởi những số khác nhau và không có chữ số nào trùng với số 4. Tích các chữ số đó liệu có lớn hơn 2005 không?”.

    Tuấn Anh nhẩm tính một lúc rồi nói với mẹ:

    Tích là số lớn lắm, lớn hơn 2005 nhiều mẹ ạ.

    Theo bạn Tuấn Anh nói đúng hay sai?

    Hướng dẫn.

    Cuốn sách “VUI HỌC TOÁN 4” chỉ có 9 chữ cái khác nhau là V, U, I, H, O, C, T, A, N mà hông có chữ nào được thay bởi số 4 nên 9 chữ ấy phải thay bởi các chữ số 0,1,2,3,5,6,7,8,9.

    Tích của tất cả các chữ này bằng 0 vì có một thừa số bằng 0.

    Vậy Tuấn Anh đã nói sai.

    Bài 15: SỐ NÀO?

    Chị Hiền cho em Trí làm bài tính nhân một số tự nhiên với 9. Trí làm xong , chị Hiền ghi cho Trí số 4297 và nói đây là đáp số. Trí nhìn đáy số chị Hiền đưa ra và nói rằng “ Đáp số của chị còn thiếu một chữ số, nó nằm ở chính giữa số này !”

    Bạn hãy cho biết chị Hiền đã cho Trí số nào nhân với 9?

    Hướng dẫn.

    Gọi chữ số còn thiếu của đáp số đúng là A, ta có số 42A97 chia hết cho 9. Do đó 4 + 2 + A + 9 = 22 + A chia hết cho 9. Tính ra được A = 5.

    Số mà chị Hiền cho Trí nhân với 9 là:

    42597 : 9 = 4733

    Đáp số: 4733

    Bài 16: RỔ NÀO ĐỰNG CAM?

    Có hai rổ đựng cam, ba rổ đựng quýt với số quả cam và quả quýt có trong năm rổ là: 60; 45; 75; 65; 55.

    Không cho biết rổ nào đựng cam, rổ nào đựng quýt. Chỉ biết rằng số quả quýt gấp hai lần số quả cam.

    Hỏi rổ nào đựng cam?

    Hướng dẫn.

    Số quả quýt gấp hai lần số quả cam. Nên số quả quýt và cam gấp 3 lần số quả cam.

    bai toan lop 4 so do

    Số quả cam có là:

    (60 + 45 + 75 + 65 + 55) : 3 = 100 (quả)

    Dễ thấy 45 + 55 = 100 (quả)

    Vậy hai rổ đựng cam là rổ đựng 45 quả và rổ đựng 55 quả.

    Bài 17: CAM VÀ XOÀI.

    Một người bán sáu giỏ cam và xoài. Mỗi giỏ chỉ đựng hoặc là cam hoặc là xoài, với số lượng như sau: 36; 39; 40; 41; 42; 44. Biết rằng sau khi bán một giỏ xoài thì số cam còn lại gấp 4 lần số xoài còn lại.

    Hãy cho biết giỏ nào đựng xoài, giỏ nào đựng cam?

    Hướng dẫn.

    Vì số cam còn lại gấp 4 lần số xoài còn lại nên tổng số cam và số xoài còn lại là số chia hết cho 5.

    Số cam và xoài mang ra chợ là:

    36 + 39 + 40 + 41 + 42 + 44 = 242 (quả)

    Số 242 chia cho 5 còn dư 2.

    Vậy giỏ xoài bán đi có số quả là số chia cho 5 còn dư 2.

    Trong các số 36; 39; 40; 41; 42; 44 chỉ có số 42 chia cho 5 còn dư 2.

    Vậy số cam và xoài còn lại là;

    242 – 42 = 200 (quả)

    Số xoài còn lại là:

    200 : 5 = 40 (quả)

    Đáp số: Các giỏ xoài 40 quả và 42 quả

    Các giỏ cam: 36 quả; 39 quả; 41 quả; 44 quả.

    Bài 18: AI ĐÚNG? AI SAI?

    Toán đố Tuổi và Thơ: “ Không tính tông bạn hãy cho biết ngay tổng của 2005 số tự nhiên liên tiếp bắt đầu từ 1 là số chẵn hay số lẻ?”.

    Tuổi nói ngay: “Chắc chắn là số chẵn”.

    Thơ suy nghĩ một lúc rồi trả lời: “là một số lẻ”.

    Chắc chắn sẽ có một bạn nói đúng, một bạn nói sai phải không các bạn? Chúng ta cùng tìm xem ai đúng, ai sai nhé!

    Hướng dẫn.

    Các số tự nhiên liên tiếp từ 1 đến 2005 sẽ tạo thành dãy số sau:

    1; 2; 3; 4; 5; … ; 2003; 2004; 2005.

    Dãy số trên ta thấy cứ một số lẻ lại có một số chẵn, mà bắt đầu vào dãy là số lẻ và kết thúc cũng là số lẻ nên số các số lẻ nhiều hơn số các ố chẵn là một số.

    Từ 1 đến 2005 có 2005 số. Do đó, ta có:

    • Số các số chẵn là: (2005 -1) : 2 = 1002 (số)
    • Số các số lẻ là: 1002 + 1 = 1003 (số)
    • Tổng của 1002 số chẵn là một số chẵn
    • Tổng của 1003 số lẻ là một số lẻ.

    Do đó tổng của 2005 số tự nhiên liên tiếp từ 1 đến 2005 là một số lẻ.

    Vậy Thơ nói đúng và tuổi nói sai.

    Bài 19: CÁC SỐ VÀ CÁC Ô VUÔNG

    Hãy tìm cách viết vào mỗi ô vuông một trong các số tự nhiên từ 1 đến 10 để các phép tính sau đều đúng.

    cau do vui lop 4

    Hướng dẫn.

    Ô cuối cùng ở góc bên phải chỉ có thể là số 10. Do đó cột bên phải là 5 x 2 = 10.

    Bài 20: DỜI MỘT ĐỒNG TIỀN

    Bé Hoa đặt lên bà 6 đồng tiền thành hình chữ thập (hình bên)

    Bạn hãy dời một đồng tiền để tổng số tiền trên một đường thẳng là 4 đồng tiền.

    bai toan lop 4 di chuyen dong tien

    Hướng dẫn.

    Dời đồng tiền ở dưới cùng đạt chồng lên đồng tiền ở giữa.

    Bài 21: HAI MƯƠI CHỮ SỐ 1

    Bạn hãy dùng 20 chữ số 1 và đạt giữa chúng những dấu cộng (+) để được tổng bằng 200.

    Bạn hãy cho biết vì sao bạn làm được như vậy?

    Bài 22: SIÊU TOÁN

    Mão là một học sinh được bạn bè trong lớp suy tôn là siêu sao giải toán nhanh. Một hôm bạn Thân đố Mão tính tổng sau:

    99 + 199 + 299 + 399 + … + 899.

    Mão! … chỉ một thoáng đã đọc kết quả trước sự thán phục của Thân.

    Bí quyết nào giúp Mão thế? Bạn có biết không?

    Bài 23: AI ĐƯỢC THƯỞNG?

    Bác Tuấn nói rằng: “Ai giúp bác thay các chữ cái bằng các chữ số thích hợp ở phép tình sau, bác sẽ thưởng cho 10 triệu đồng”.

    bai toan lop 4 tim so abcde

    Ai được thưởng bạn có biết không?

    Bài 24: VUI HỌC.

    Các bạn có thay được các chữ cái bằng các chữ số thích hợp để được phép tính ở dưới không?

    bai toan lop 4 tim so VUIHOC

    Bài 25: AI LẤY SỐ CHẴN?

    Anh Quân có hai mảnh giấy giống hệt nhau, một mảnh anh ghi một số chắn, một mảnh anhh ghi một số lẻ. Anh đưa cho Lâm và Ly xem rồi gấp lại trộn đều và đưa cho Lâm và Ly bốc thăm.

    Bốc xong rồi Ly nhanh nhảu:

    • Để làm gì hở anh?

    Anh Quân cười:

    • Anh sẽ nói ngay được ai lấy số chẵn. Trước hết Lâm nhân số của mình với 5. Bí mật cộng hai tích đó lại và báo cho anh kết quả là số chẵn hay số lẻ.

    Lâm và Ly tính xong Lâm thông báo:

    • Kết quả là số lẻ anh ạ.

    Anh Quân nói luôn:

    • Vậy chính em lấy được số chẵn.

    Cả Lâm và Ly đều ngạc nhiên:

    • Sao anh giỏi thế!

    Các bạn ơi, Anh Quân đã tính thế nào nhỉ?

    Bài 26: BA CHÀNG CÂU CÁ

    Một ngày chủ nhật, được nghỉ học, ba bạn chơi thân với nhau là An, Phương, Minh rủ nhau đi câu cá. Khi về An thấy mình câu được nhiều cá bèn cho Phương và Minh một số cá bằng số cá bằng mỗi người hiện có. Khi ấy, Phương thấy mình nhiều cá quá liền cho lại An và Minh số cá bằng số cá của mỗi người hiện có. Sau lần đó , Minh thấy có nhiều cá hơn các ban nên cho lại An và Phương số cá bằng số cá hiện có củ mỗi người. Lúc này của số cá của ba người đều bằng nhau và họ cùng vui vẻ ra về.

    Bạn hãy tính xem mỗi người câu được bao nhiêu con cá, biết cả ba người câu được 24 con cá.

    Bài 27: SỐ CHẴN HAY SỐ LẺ?

    Anh Tuấn có 25 miếng bìa nhỏ, anh yêu cầu bé Lan viết các số tự nhiên liên tiếp từ 1 đến 55 lên mặt phải của 55 miếng bìa đó, sau đó, anh xáo trộn các miếng bìa và yêu cầu Lan viết lên mặt trái của miếng bìa lần lượt các số từ 1 đến 55 một lần nữa.

    Bây giờ các bạn hãy cộng hai số đã viết trên hai mặt của tấm bìa sau đó nhân 55 kết quả đó với nhau xem được số chẵn hay số lẻ?

    Bài 28: BAO NHIÊU NĂM NỮA?

    Cha nay bốn mốt tuổi rồi

    Con vừa mười bảy đang thời xuân xanh

    Bao nhiêu năm nữa đến phần

    Tuổi cha gấp đúng hai lần tuổi con?

    Bài 29: NHỮNG MIẾNG BÌA LANG THANG

    Cậu Mít cắt một tấm bìa thành hình tròn rất đẹp. Sau đó Mít chia tấm bìa thành 20 ô nhỏ, mỗi ô Mít viết một số hoặc một dấu trong các số 1,2,4,6,0,5 và trong các dấu +; – ; x ; : ; = để được phép tính đúng. Một lúc sau Mít lại hí hoáy cắt tấm bìa thành 7 miếng và thả chúng lang thang quanh bàn học của Mít. Bây giờ các bạn hãy xếp các miếng bìa lang thang này lại thành tấm bìa ban đầu của Mít nhé.

    Bài 30: PHÉP TÍNH CỘNG SAI!

    Cho phép cộng sau: Hãy giải thích phép tính cộng này là sai.

    1 8 * *

    + 3 7 * *

    4 6 * *

    1 * 5 * *

    Bài 31: BÂY GIỜ LÀ MẤY GIỜ?

    Vui hỏi Toán “Bây giờ là mấy giờ?

    Toán trả lời: “Từ 12 giờ trưa đến bây giờ, bằng thời gian từ bây giờ đến nửa đêm”

    Vui suy nghĩ và hớn hở nói rằng “ Tớ biết bây giờ là mấy giờ rồi!”

    Lúc đó là mấy giờ? Đố bạn biết đấy!

    Bài 32: CHIA THÙNG VÀ CHIA MẮM

    Ba bà Thược, Loan, Liên có tất cả 7 thùng đựng đầy mắm, 7 thùng đựng mắm đầy một nửa và 7 thùng không, bạn hãy giúp ba bà chia dều số mắm và số thùng để mỗi người đều được phần bằng nhau mà không phải rót mắm sang thùng khác đâu nhé?

    Bài 33: NGÀY 18 THÁNG 2 LÀ THỨ MẤY?

    Tồ đố Tèo: ‘Này nhé, tháng 2 năm 2004 có đến năm ngày chủ nhật, đố Tèo ngày 18 tháng 2 năm 2004 là thứ mấy”. Tèo liền đứng dậy, Tồ nắm giữ tay Tèo và hỏi “Cậu định đâu”.

    Tèo trả lời: “tớ đi tìm tờ lịch măm 2004 để trả lời cậu”.

    Tồ nói: “ Thế thì tớ đố làm gì? Không được xem lịch mà suy nghĩ để tìm câu trả lời”… Tèo đàng chịu thua.

    Các ban hãy giúp Tèo nhé.

    Bài 34: CHỈ MỘT LẦN CÂN

    Có mười cái túi đựng tiền vàng có hinhfdangj giống hệt nhau, trong đó có một túi đựng tiền giả. Những đồng tiền giả nhẹ hơn 1 gam so với đồng tiền thật nặng 10 gam.

    Bằng chiếc cân đồng hồ và chỉ một lần cân hãy tìm ra túi đồng tiền giả.

    Bài 35: BA CAN DẦU

    Cô Mai có 12 lít đựng đầy dầu và hai can 7 lít và 5 lít không đựng gì. Cô muốn chia số dầu có được của mình thành ba phần: 5 lít ; 4 lít ; 3 lít bằng ba cái can này.

    Bạn hãy giup cô Mai nhé!

    Bài 36: LẤY BẢY LÍT NƯỚC

    Bạn Tuyền có hai cái can: một can loại 5 lít và một can loại 3 lít.

    Tuyền muốn lấy đúng 7 lít nước từ 1 hồ (bể) nước.

    Tuyền cứ loay hoay maixmaf chưa lấy được đủ 7 lít nước.

    Các ban hãy giúp bạn Tuyền nhé!

    Bài 37: ĐỒNG HỒ HƯ

    Có một đồng hồ hư, cứ mỗi ngày (24 giờ =1440 phút) nó lại chạy chậm 10 phút. Đúng 7 giờ sáng hôm đó người ta vặn đồng hồtheo giờ đúng.

    Hỏi sau bao nhiêu ngày đồng trên chỉ đúng 7 giờ sáng?

    Bài 38: MỘT VIÊN BI LẠ

    Dũng có bốn viên bi, trong đó có ba viên nặng bằng nhau còn một viên không nặng như ba viên kia (có thể nặng hơn hoặc nhẹ hơn). Nhìn bề ngoài cả bốn viên bi giống hệt nhau nên không thể xác định được viên bi lạ này.

    Bạn nào có thể tìm được viên bi lạ ấy chỉ bằng nhiều nhất hai lần cân trên cân hai đĩa?

    Bài 39: CÁ NẶNG BAO NHIÊU?

    Thấy bố đang thịt một con cá rất ngon, Tí, Tồ đến bên và hỏi bố:

    Bố ơi, con cá này nặng bao nhiêu mà to thế?

    Bố Tí, Tồ mỉm cười nói:

    Đuôi của cá nặng 150 gam, đầu cá nặng bằng đuôi cá cộng nửa thân cá. Thân cá bằng đầu cá cộng với đuôi cá.

    Các con tính xem con cá nặng bao nhiêu gam?

    Tí, Tồ tính mãi mà không đúng. Các bạn hãy giúp Tí, Tồ nhé!

    Bài 40: TÌM ĐỒNG TIỀN GIẢ

    Có 27 đồng tiền kim loại giống hệt nhau trong đó có một đồng tiền giả nhẹ hơn đồng tiền thật. Các đồng tiền thật có cùng khối lượng.

    Bây giờ phải lấy ra được đồng tiền giả đó với ba lần cân và chỉ dùng chiếc cân hai đĩa. Vậy phải cân thế nào đậy?

    Bài 41: CÂN THẾ NÀO ĐÂY

    Một cửa hàng nhập vào 80 gói kẹo giống hệt nhau và được biết trong đó có một gói kẹo nhẹ hơn các gói kẹo khác. Bây giờ phải xác định được gói kẹo nhẹ đó, nhưng cửa hàng chỉ có một chiếc cân hai đĩa. Làm thế nào để chỉ 4 lần cân mà xác định được gói kẹo nhẹ đó?

    Các bạn hãy cùng trổ tài để giúp cô nhân viên bán hàng nhé!

    Bài 42: THỨ MẤY?

    Hùng nhớ mãi ngày lễ 20/11/2004 (ngày nhà giáo Việt Nam) vì hôm đó lớp Hùng tổ chức vui lắm. Các bạn chúc mừng cô giáo bằng lời ca tiến hát và những bông hoa điểm mười rực rỡ. Cô giáo vui mừng hỏi cả lớp

    “Hôm nay là thứ mấy?”

    Cả lớp đồng thanh trả lời: “ Hôm nay là thứ bảy ạ”.

    Cô hỏi tiếp: “ Đố các con 28 năm nữa thì ngày 20/11 là thứ mấy?”.

    Cả lớp im lặng suy nghĩ, và rồi chính Hùng trả lời được câu hỏi của cô sớm nhất.

    Hôm đó Hùng được cô thưởng quà và khen Hùng giỏi toán. Các bạn đoán xem câu trả lời của Hùng như thế nào nhé!

    Bài 43: HÃY GIÚP BẠN BỜM

    Bạn Bờm có chín số là: 1;3;5;9;11;13;15;17. Bờm muốn đặt mỗi số này vào một ô vuông ở bảng dưới đây để tổng các số trên ba cột lần lượt là: 25;30;26. Bờm loay hoay mãi mà vẫn chưa tìm được cách đặt các số vào các ô vuông. Các bạn hãy giúp bạn Bờm nhé!

    ma tran 3x3

    Bài 44: TÍNH DIỆN TÍCH HÌNH VUÔNG

    Tính diện tích hình vuông ABCD, biết rằng tổng các chu vi của sáu hình chữ nhật nhỏ ở hình bên là 50 cm.

    Bài 45: CHIA THẾ NÀO?

    Tam ngồi đăm chiêu trước một bàn cờ có 8 x 8 = 64 ô vuông. Tứ đến bên bạn hỏi: Bạn đang nghiên cứu gì ở bàn cờ mà say sưa thế?

    Tam quay sang Tứ nói: Anh Nam vừa đố tớ chia bàn cờ thành bảy hình chữ nhật khác nhau mà số ô đen và số ô trắng ở mỗi hình chữ nhật đều bằng nhau. Mình với bạn cùng nghĩ nhé.

    Hai bạn chụm đấu kẻ rồi lại xóa mãi mà không tìm ra kết quả. Các bạn có thể giúp hai bạn ấy không?


    chia bàn cờ vua 

    Bài 46: ĐIỀN SỐ VÀO Ô TRÒN

    Hãy viết các số tự nhiên liên tiếp từ 1 đến 6 vào các ô tròn trên các cạnh của tam giác sao cho tổng các số trên 3 cạnh đều bằng 9.

    bai toan lop 4 viet so vao cac hinh tron o dinh tam giac

    Bài 47: CHỈ VẼ MỘT NÉT

    1. Hãy vẽ một nét gồm 4 đoạn thẳng chứa 9 điểm (Hình a)
    2. Hãy vẽ một nét gồm 6 đoạn thẳng chứa 16 điểm (Hình b)
    3. Hãy vẽ một nét gồm 8 đoạn thẳng chứa 25 điểm (Hình c)

    ve hinh bang 1 net khong nhấc bút

     

    Bài 48: XẾP HÌNH CHỮ NHẬT

    Dịu có 16 que dài 1 cm, 16 que dài 2 cm, 15 que dài 3 cm. Dịu đưa số que này cho Dàng và đố Dàng xép thành một hình chữ nhật.

    Dàng khẳng định : “ Đơn giản tớ xếp được ngay”.

    Thế nhưng … Dàng hì hụi xếp mãi mà vẫn không được. Các bạn có xếp được không ?

    Bài 49: CHIA BÁNH CHƯNG XANH

    Có một chiếc bánh chưng xanh đã bóc lá. Bạn hãy chia chiếc bánh chưng đó thành 8 phàn bằng nhau bởi 3 chiếc lạt, sao cho mỗi phần đều có cả bánh lẫn nhân như nhau.

  • Difference: MISTAKE vs FAULT vs ERROR vs BLUNDER vs DEFECT?

    Difference: MISTAKE vs FAULT vs ERROR vs BLUNDER vs DEFECT?

    MISTAKE vs FAULT vs ERROR vs BLUNDER vs DEFECT

    PHÂN BIỆT ERROR, MISTAKE, FAULT, BLUNDER và DEFECT.
    MISTAKE, BLUNDER, FAULT and ERROR mean something done incorrectly or improperly. Các từ này đều là danh từ và có nghĩa là “lỗi, sai lầm”. Tuy nhiên giữa chúng có sự khác biệt.

    Difference: MISTAKE vs FAULT vs ERROR vs BLUNDER vs DEFECT? 21. Cách sử dụng FAULT

    Fault: dùng khi nói về trách nhiệm của 1 ai đó khi làm sai hoặc khi nói về những khuyết điểm thuộc về tính cách của 1 người nào đó. FAULT implies that you are talking about culpability or responsibility.

    • It will be your own fault if you don’t pass the exam. (Nếu bạn không qua kỳ thi này, đó là lỗi của bạn).
    • It was not his fault that his team lost the match.
    • It was my fault that there was an error in the computer program.
    • It’s not my fault he’s late. Don’t blame me. (Cậu ta muộn không phải do lỗi của mình. Đừng khiển trách mình).
    • She has her faults, but, on the whole, she’s a nice person. (Cô ta có những điểm thiếu sót, nhưng nhìn chung cô ấy là người tốt).
    • A mechanical fault caused the train to come off the rails. (Sự cố về máy móc đã làm cho chuyến tàu trật khỏi đường ray).

    2. Cách sử dụng từ MISTAKE

    Mistake: nói về 1 hành động hay 1 ý nghĩ sai lầm và đem lại kết quả không mong muốn. Đặc biệt là có những kết từ với “mistake” như: make a mistake/make mistakes (phạm phải sai lầm), by mistake (do nhầm lẫn). MISTAKE is the most general term used of everyday situation.

    • Waiter! I think you’ve made a mistake over the bill.
    • It was a big mistake to leave your umbrella at home.
    • Coming to this place was a big mistake. We only wasted our time.
    • It was a mistake to go there on Sunday.
    • I committed a mistake of leaving our bedroom window open.

    3. Cách sử dụng từ ERROR

    Error: trang trọng hơn “mistake”, và đặc biệt được dùng khi lỗi đó gây ra vấn đề hoặc ảnh hưởng đến 1 thứ khác. ERROR is more suitable for more formal contexts. Some may consider ‘error’ to be much more severe than ‘mistake’.

    • Errormistake là những từ đồng nghĩa, cùng để chỉ một hành động sai lầm do sự đánh giá kém, hoặc thiếu hiểu biết, hoặc bất cẩn.
    • Error ám chỉ một sai trái về mặt đạo đức, còn mistake ám chỉ sự đánh giá sai.
    • Error là một từ có tính cách trang trọng hơn.

    Error thường được dùng trong các ngữ cảnh trang trọng hoặc liên quan đến kỹ thuật. Ví dụ, chúng ta sẽ dùng system error hơn là system mistake. Trong khi đó mistake được dùng nhiều hơn trong giao tiếp tiếng Anh hàng ngày.

    Ví dụ về cách dùng từ ERROR:

    • The grammatical errors in this Book could not be ignored.
    • The essay contains a number of typing errors.
    • The computer produced an error when the data was incorrect.
    • His speech contained several factual errors.
    • I made an error in my calculations.
    • The telephone bill was too far high due to a computer error. (Hóa đơn điện thoại cao hơn hẳn là do lỗi của máy tính.)
    • The computer gave me a 404 error.
    • Your work is full of spelling mistakes /errors. Bài làm của bạn đầy những lỗi chính tả. (có tính cách trang trọng hơn thì dùng errors).

    4. Khi nào dùng DEFECT?

    Defect: nói về những sai sót, hỏng hóc, khiếm khuyết trong quá trình 1 thứ gì đó được tạo ra.

    • There are defects in our educational system. (Hệ thống giáo dục của chúng ta có những khuyết điểm.)
    • There are serious defects in our management system. (Hệ thống quản lý của chúng ta có những khuyết điểm nghiêm trọng).

    5. Cách sử dụng từ BLUNDER

    BLUNDER is a careless mistake often unnecessarily or resulting from misjudgment.

    • I made a terrible blunder in introducing that beautiful girl to my husband.
    • He said that the tax was a major political blunder.
    • I made a blunder by getting his name wrong.

    6. Cách dùng từ WRONG

    WRONG means that something is not correct. It is an adjective. “Wrong” được dùng khi một người hoặc một vật nào đó không đúng, không chính xác, hiểu sai…

    Ví dụ về cách sử dụng từ WROENG

    • You are wrong. (Cậu nhầm rồi)
    • Your answer is wrong. (Câu trả lời của cậu sai rồi)
    • Some of your answers were correct, and some were wrong .
    • Something is wrong with my cellphone .
    • Don’t cry, honey. Tell me what’s wrong.
    • It is wrong to lie.
    • You’re wrong: he’s not Superman at all.

    Một số cụm từ, tục ngữ đi cùng với “wrong”:

    • Two wrongs don’t make a right (đừng viện cớ bào chữa)
    • Get the wrong end of the stick (hiểu lầm hoàn toàn điều người khác nói)
    • To know right from from wrong (Biết phân biệt phải trái)

    mistake vs fault

  • List Danh sách diễn đàn đi backlink dofollow 2022

    List Danh sách diễn đàn đi backlink dofollow 2022

    List Danh sách diễn đàn đi backlink dofollow 2022

    Để các bài viết được Google đánh giá cao, ngoài việc viết bài chuẩn SEO thì cũng cần đi thêm backlink. O2 Education xin giới thiệu danh sách diễn đàn đi backlink mới nhất năm 2020. Đa số các diễn đàn đều cho đăng link dofollow. Các diễn đàn đều là tiếng Việt và có chủ đề đa dạng, từ tổng hợp cho tới giáo dục đào tạo, lập trình…

    🔥LIST DIỄN ĐÀN SEO 2021

    1. Danh sách diễn đàn đi backlink

    • https://techrum.vn
    • https://123nhanh.com
    • https://24hlamdep.net
    • https://agriviet.com
    • https://aoevietnam.org
    • https://bachhoadep.com/diendan/
    • https://bang.vn/
    • https://biquyetlamsach.com/
    • https://bmktd.utc.edu.vn/forum
    • https://chophien.com/
    • https://dhd.vn/forums/
    • https://diadiemkhuyenmai.com/dien-dan/
    • https://dienanh.net/
    • https://diendan.hocmai.vn/
    • https://diendan.hpu.edu.vn/
    • https://diendan.phununet.com/
    • https://diendan.raovat.vn/
    • https://diendan.vtcgame.vn/
    • https://diendan.zing.vn/
    • https://diendanlamdep.edu.vn/
    • https://diendansacdep.net/
    • https://diendanthammy.net/
    • https://diendantoanhoc.net/
    • https://duyendangaodai.net/
    • https://emdep.vn/diendan/
    • https://enbac.com/
    • https://forum.hcmiu.edu.vn/
    • https://forum.mwork.vn/forum.php
    • https://forum.smas.edu.vn/
    • https://forum.tinhdaudua.com.vn/
    • https://forum.trochoithoitrang.net/
    • https://forum.tuvantamly.vn/
    • https://forum.ueh.edu.vn/
    • https://forum.uit.edu.vn/
    • https://forum.vietstock.vn/
    • https://forumlamdep.net/
    • https://forumsuckhoe.com/
    • https://game8.vn/
    • https://gamevn.com/
    • https://giadinhnhohanhphucto.com/
    • https://goclamdep.vn/
    • https://gsm.vn/forums
    • https://hoiphunu.com/forums/
    • https://ipp.topica.edu.vn/
    • https://itseovn.com/
    • https://khoahoclamdep.com/forums/
    • https://lamdep.forumotion.net/
    • https://memmai.com/forum/index.php
    • https://muaban.net/
    • https://muare.vn/
    • https://muare.vn/forums
    • https://mwork.vn/
    • https://open.ptit.edu.vn/
    • https://pcworld.com.vn/
    • https://phunu8.com/
    • https://phunutamsu.com/forum.php
    • https://phunuviet.com.vn
    • https://phunuvn.net/
    • https://raovat.chonmua.com/
    • https://raovat.com/
    • https://raovat.net/
    • https://raovat.vn/
    • https://raovatnhanh.edu.vn/
    • https://rongbay.com/
    • https://ssc.vn/
    • https://suckhoe365.net/
    • https://suckhoesacdep.net/forum/
    • https://suckhoethammy.vn/
    • https://suckhoetoday.com/
    • https://thienduongspa.com.vn/forum/forum.php
    • https://toiyeuphunu.net/
    • https://truongton.net/
    • https://ttvnol.com/
    • https://tudomuaban.com/
    • https://uhm.vn/
    • https://uhm.vn/forum/
    • https://vatgia.com
    • https://vn-zoom.com/
    • https://vozforums.com/
    • https://www.5giay.vn
    • https://www.chuyentranglamdep.com/
    • https://www.ddld.vn/
    • https://www.diendanmevabe.com/forum.php
    • https://www.hce.edu.vn/
    • https://www.suasoan.com/
    • https://www.tamsuphaidep.com/forum/forum.php
    • https://www.trangtinlamdep.com/forum.php
    • https://www.vietvbb.vn/
    • https://www.vietvbb.vn/
    • https://www.vnphoto.net/
    • https://www.webketoan.vn/
    • https://www.webtretho.com/
    • https://www.webtretho.com/forum/
    • https://www.xosothantai.com/
    • https://www.ykhoaviet.com
    • https://www.yly.vn/
    • https://www.lamchame.com/forum

    2. Danh sách diễn đàn đi backlink profile

    • https://www.slideshare.net/
    • https://www.edocr.com/
    • https://vi.scribd.com/
    • https://www.slideserve.com/
    • https://issuu.com/home/publisher
    • http://www.yudu.com/
    • http://forum.linksearching.com/
    • http://www.webmasterforums.com/
    • http://www.freehostforum.com/
    • https://forums.digitalpoint.com/
    • https://www.sitepoint.com/community/
    • http://www.v7n.com/forums/
    • http://htmlforums.com/
    • https://www.webmasterserve.com/webmaster-forums/
    • https://forum.textpattern.io/
    • http://www.delphiforums.com/
    • http://www.talkgold.com/forum/
    • http://www.warriorforum.com/
    • http://simplemachines.org/community/index.php
    • http://iq69.com/
    • https://www.acorndomains.co.uk/
    • https://www.cnet.com/forums/
    • https://forums.onlinebookclub.org/
    • https://ubuntuforums.org/
    • https://forums.mysql.com/
    • https://irishwebmasterforum.com/
    • http://paymentprocessing.cc/
    • http://forums.comicbookresources.com/
    • http://forums.seochat.com/
    • https://www.dnforum.com/
    • http://affiliateseeking.com/forums/
    • http://siteownersforums.com/index.php
    • http://www.seorefugee.com/forums/forum.php
    • http://www.talkingcity.com/
    • https://forum.joomla.org/
    • https://forums.gentoo.org/
    • http://geekvillage.com/forums/
    • http://www.webmastershelp.com/
    • https://www.smallbusinessforums.org/
    • http://forum.hittail.com/
    • http://webcosmoforums.com/
    • http://www.v7n.com/forums/index.php
    • https://www.webmasterworld.com/
    • http://www.wjunction.com/
    • https://www.adsfreeforum.com/
    • https://www.dropbox.com/
    • http://mgl.scripps.edu/forum/
    • http://ivf.ca/forums/
    • http://www.pets.ca/forum/
    • http://mygicasupport.com/
    • https://forums.iis.net/
    • https://www.techenclave.com/community/
    • http://www.erodov.com/forums/
    • http://geek.digit.in/community/
    • http://etalkindia.com/talk/forum.php
    • http://www.india-forums.com/
    • https://auth.lonelyplanet.com/
    • http://forum.notebookreview.com/
    • http://siteownersforums.com/
    • https://forum.wordreference.com/
    • https://forums.adobe.com/people/tuanq39993263
    • http://www.fodors.com/community/
    • https://forums.anandtech.com/
    • https://www.technibble.com/forums/
    • http://forum.x86pad.com/
    • http://www.webcosmoforums.com/
    • https://www.laptop-forums.com/
    • https://computerhelpforums.com/
    • http://steamcommunity.com/discussions/
    • http://www.nairaland.com/
    • https://forums.pcpitstop.com/
    • http://forums.majorgeeks.com/index.php
    • https://forums.asp.net/
    • https://css-tricks.com/forums/
    • https://rog.asus.com/forum/
    • http://www.webhostingtalk.com/
    • http://forum.codeigniter.com/
    • http://discuss.tigweb.org/
    • http://www.businessadviceforum.com/
    • https://www.blackhatworld.com/
    • https://bitcointalk.org/
    • http://forum.chinabuye.com/forum.php
    • https://forums.mydigitallife.net/
    • https://windowsforum.com/
    • https://forums.lenovo.com/t5/English-Community/ct-p/Community-EN
    • https://www.cometforums.com/
    • http://www.mtforum.in/
    • http://www.wrensoft.com/forum/
    • http://forum.ventrilo.com/
    • http://flashpanoramas.com/forum/
    • https://forums.cpanel.net/
    • https://www.redtape.ru/forum/
    • http://www.badcaps.net/forum/
    • http://studychacha.com/discuss/
    • http://www.alzforum.org/
    • https://community.skype.com/?category.id=English&profile.language=en
    • http://www.gohighvoltage.com/forum/
    • https://discourse.omnigroup.com/
    • http://www.greentram.com/forums/
    • http://www.city-data.com/forum/
    • http://www.rage3d.com/board/
    • https://community.virginmobile.com.au/
    • https://community.sony.com/
    • https://forum.thegamecreators.com/
    • https://discussions.apple.com/welcome
    • https://forums.roku.com/

     3. Danh sách website rao vặt

    • https://raovat.vnexpress.net/
    • https://muaban.net/
    • https://nhattao.com/
    • https://muare.vn/
    • https://www.phomuaban.vn/
    • http://raovat.vn/
    • https://chocudan.com/
    • https://raovat.net/
    • https://tudomuaban.com/
    • https://www.raovatmienphi.org/
    • https://www.chotot.com/
    • http://bamien.com.vn/
    • https://123nhadatviet.com/
    • https://www.1doi1.com/
    • https://vatgia.com/home/
    • http://kenhdangtin.com/
    • https://raovat321.com/
    • https://vnraovat.net/
    • https://raovat49.com/
    • http://timdat.net/
    • https://diendanraovataz.net/
    • http://www.raovat.info/
    • https://avraovat.com/
    • http://timmuanhadat.com.vn/
    • http://www.vietnamdaily.com/
    • https://hopcho.vn/
    • https://airaovat.com/
    • https://chothai.com.vn/
    • http://muabanraovat.com/

     

  • Toán 10 – Biện luận hệ phương trình, hệ bất phương trình bằng đồ thị

    Toán 10 – Biện luận hệ phương trình, hệ bất phương trình bằng đồ thị

    Biện luận hệ phương trình, hệ bất phương trình bằng đồ thị

    Sử dụng sự tương giao của đường tròn và đường thẳng trong mặt phẳng tọa độ Oxy, chúng ta có thể dễ dàng Biện luận hệ phương trình, hệ bất phương trình có chứa tham số.

    Xem thêm:

    1. Lý thuyết biện luận hệ phương trình, hệ bất phương trình bằng đồ thị

    Nhắc lại rằng, đối với hệ phương trình hai ẩn, hệ bất phương trình hai ẩn $ x,y$ thì mỗi nghiệm của nó là một cặp số $ (x;y)$ thỏa mãn hệ đã cho. Mỗi cặp số $ (x;y)$ này chính là tọa độ của một điểm ở trong mặt phẳng tọa độ $ Oxy$.
    Để biện luận hệ phương trình, hệ bất phương trình đã cho, chúng ta biểu diễn các phương trình, bất phương trình của hệ bởi những đường thẳng, đường tròn hoặc miền mặt phẳng giới hạn bởi các đường thẳng, đường tròn trong mặt phẳng. Khi đó, số nghiệm của hệ phương trình, của hệ bất phương trình chính bằng số điểm chung của các đường thẳng và đường tròn này.

    • Trong mặt phẳng $ Oxy$, phương trình đường thẳng có dạng tổng quát $$ ax+by+c=0 $$
    • Phương trình đường tròn tâm $ I(a,b)$ bán kính $ R$ là $$ (x-a)^2+(y-b)^2=R^2 $$
    • Khoảng cách từ điểm $ M(x_0;y_0)$ tới đường thẳng $ \Delta:ax+by+c=0$ là
      $$ d(M,\Delta)=\frac{|ax_0+by_0+c|}{\sqrt{a^2+b^2}} $$
    • Vị trí tương đối của đường thẳng $ \Delta$ và đường tròn tâm $ I$, bán kính $ R$:
      • có một điểm chung khi và chỉ khi $ d(I,\Delta)=R$
      • có hai điểm chung khi và chỉ khi $ d(I,\Delta)<R$
      • có không điểm chung khi và chỉ khi $ d(I,\Delta)>R$

    2. Các ví dụ Biện luận hệ phương trình, hệ bất phương trình bằng đồ thị

    Bài 1: Tìm $ a$ để hệ sau có nghiệm duy nhất: $$\left\{ \begin{array}{lr}
    {x^2} + {y^2} – 2x \le 2&(1)\\
    x – y + a = 0&(2)
    \end{array} \right.$$
    Lời giải: Ta có bất phương trình (1) tương đương với $$ {(x – 1)^2} + {y^2} \le 3$$ Bất phương trình này biểu diễn hình tròn $ (C)$ có tâm $ I(1;0)$ bán kính $R=\sqrt 3 $ trên mặt phẳng tọa độ $ Oxy$. Phương trình (2) biểu diễn đường thẳng $ \Delta:x-y+a=0$. Để hệ có nghiệm duy nhất thì đường thẳng phải tiếp xúc với đường tròn. Điều này xảy ra khi và chỉ khi
    \begin{align*}
    d\left( {I,\Delta } \right) &= R\\
    \Leftrightarrow \frac{{\left| {1 – 0 – a} \right|}}{{\sqrt 2 }}& = \sqrt 3
    \end{align*}
    Giải hệ này, tìm được đáp số $ a = – 1 – \sqrt 6 ;a = – 1 + \sqrt 6 $.

    Bài 2: Tìm $ a$ để hệ sau có nghiệm duy nhất: $$\left\{ \begin{array}{l}
    x + y + \sqrt {2xy + m} \ge m\\
    x + y \le 1
    \end{array} \right.$$

    Lời giải: Hệ bất phương trình đã cho tương đương với
    \begin{align*}
    &\left\{ \begin{array}{l}
    \sqrt {2xy + m} \ge 1 – \left( {x + y} \right)\\
    x + y \le 1
    \end{array} \right.\\
    \Leftrightarrow &\left\{ \begin{array}{l}
    2xy + m \ge {\left( {1 – \left( {x + y} \right)} \right)^2}\\
    x + y \le 1
    \end{array} \right.\\
    \Leftrightarrow &\left\{ \begin{array}{lr}
    {\left( {x – 1} \right)^2} + {\left( {y – 1} \right)^2} \le m + 1&\left( 3 \right)\\
    x + y \le 1&\left( 4 \right)
    \end{array} \right.
    \end{align*}

    • Với $m+1 \le 0$ hay $m \le -1$ thì hệ vô nghiệm.
    • Với $ m+1 > 0$ hay $ m>-1$, thì bất phương trình (3) biểu diễn hình tròn $ (C)$ có tâm $ I(1;1)$ và bán kính $R=\sqrt {m + 1} $ trong mặt phẳng tọa độ Oxy. Bất phương trình (4) biểu diễn nửa mặt phẳng bờ là đường thẳng $ x+y=1$. Hệ có nghiệm duy nhất khi và chỉ khi đường thẳng $ x+y=1$ tiếp xúc với đường tròn $ (C)$. Điều kiện cần và đủ là
      $$d(I,\Delta)=R \Leftrightarrow \frac{1}{{\sqrt 2 }} = \sqrt {m + 1} \Leftrightarrow m = – \frac{1}{2}$$

    Bài 3: Tìm $ a$ để hệ sau có nghiệm: $$\left\{ \begin{array}{l}
    4x – 3y + 2 \ge 0\\
    {x^2} + {y^2} = a
    \end{array} \right.$$
    Lời giải:

    • Nếu $ a\le 0$ hệ vô nghiệm.
    • Nếu $ a> 0$ thì số nghiệm của hệ (nếu có) là số giao điểm của nửa mặt phẳng biểu diễn bởi bất phương trình $4x-3y+2 \le 0$ và đường tròn tâm $ O(0;0)$ bán kính $R=\sqrt a $. Do đó, hệ có nghiệm khi và chỉ khi $$\sqrt a \ge OH \Leftrightarrow a \ge \frac{4}{{25}},$$ trong đó, $ H$ là chân đường vuông góc hạ từ $ O$ xuống đường thẳng $ 4x-3y+2= 0$.

    Bài 4: Cho hệ bất phương trình $$\left\{ \begin{array}{lr}
    {\left( {x – 1} \right)^2} + {\left( {y – 1} \right)^2} \le 2&(5)\\
    x – y + m = 0&(6)
    \end{array} \right.$$
    Xác định $ m$ để hệ nghiệm đúng với mọi $x \in \left[ {0;2} \right]$.

    Lời giải: Tập hợp các điểm $ (x;y)$ thỏa mãn (5) là các điểm nằm trong và trên đường tròn $${\left( {x – 1} \right)^2} + {\left( {y – 1} \right)^2} = 2$$
    Đường tròn này có tâm $ I(1;1)$ và bán kính $R = \sqrt 2 $. Tập hợp các điểm $ (x;y)$ thỏa mãn (6) là các điểm nằm trên đường thẳng $\Delta $ có phương trình $x-y+m=0.$
    Gỉa sử điểm $A \in \Delta $ sao cho ${x_A} = 0$ thì tọa độ của $ A$ là $ (0;m)$; $B \in \Delta $ sao cho ${x_B} = 2$ thì $ B(2;2+m)$.

    Hệ có nghiệm với mọi $x \in \left[ {0;2} \right]$ khi và chỉ khi đoạn thẳng $ AB$ nằm trong đường tròn $ (I;R)$. Lúc đó
    $$\left\{ \begin{array}{l} IA \le R\\ IB \le R
    \end{array} \right. \Leftrightarrow \left\{ \begin{array}{l}
    {\left( {0 – 1} \right)^2} + {\left( {m – 1} \right)^2} \le 2\\
    {\left( {2 – 1} \right)^2} + {\left( {2 + m – 1} \right)^2} \le 2
    \end{array} \right. $$
    Giải hệ này tìm được $ m = 0$

    Bài 5: Cho hệ phương trình $$\left\{ \begin{array}{lr}
    {x^2} + {y^2} – x = 0&(7)\\
    x + ay – a = 0&(8)
    \end{array} \right.$$
    Tìm $ a$ để hệ có hai nghiệm phân biệt.

    Lời giải: Phương trình (7) tương đương với $$ {\left( {x – \frac{1}{2}} \right)^2} + {y^2} = \frac{1}{4}$$
    Đây là một đường tròn tâm $I\left( {\frac{1}{2};0} \right)$ bán kính $R=\frac{1}{2}$. Tập nghiệm của phương trình (8) là tọa độ những điểm nằm trên đường thẳng $ x+ay-a=0$. Họ đường thẳng này luôn di qua điểm $ A(0;1)$ cố định.
    Nhận xét điểm $ A$ nằm ngoài đường tròn $ (I;R)$, nên từ $ A$ kẻ được hai tiếp tuyến với đường tròn $ (I;R)$.

    Phương trình tiếp tuyến đó là: $ x=0$ và $x + \frac{4}{3}y – \frac{4}{3} = 0$.

    Để hệ có hai nghiệm phân biệt thì đường thẳng $ x+ay-a=0$ phải cắt đường tròn (I;R) tại hai điểm phân biệt. Vậy đường thẳng $ x+ay-a=0$ phải nằm giữa hai tiếp tuyến trên. Điều này xảy ra khi và chỉ khi $0 <a < \frac{4}{3}$.

    Bài 6: Tìm $ m$ để phương trình sau có nghiệm: $$\sqrt {1 – {x^2}} = m – x$$
    Lời giải: Đặt $y = \sqrt {1 – {x^2}} $, điều kiện$y \ge 0$ thì phương tương đương với hệ bất phương trình
    $$\left\{ \begin{array}{lr}
    {x^2} + {y^2} = 1&(2)\\
    x + y – m = 0&(3)
    \end{array} \right.$$
    Gọi hai đường thẳng song song với đường thẳng $ d:x+y-m=0$ và tiếp xúc với đường tròn $ {x^2} + {y^2} = 1$ là $d_1, d_2$. Chúng ta viết được phương trình của chúng là $$ x+y-1=0,\, x+y+\sqrt{2}=0 $$

    Để phương trình đã cho có nghiệm thì đường thẳng $ d$ phải nằm giữa hai đường thẳng $ d_1$ và $ d_2$. Điều kiện cần và đủ là
    $ – 1 \le m \le \sqrt 2 $.

    Bài 7: Tìm GTLN của hàm số: $$y = x + \sqrt {a – {x^2}} (a > 0)$$

    Lời giải: Đặt $t = \sqrt {{a^2} – {x^2}} \Leftrightarrow {x^2} + {t^2} = {a^2}$ và $ x+t-y=0$. Chúng ta cần tìm điều kiện để hệ sau có nghiệm
    $$\left\{ \begin{array}{lr}
    {x^2} + {t^2} = {a^2}&(1)\\
    x + t – y = 0&(2)
    \end{array} \right.$$

    Bài 8: Hãy biện luận số nghiệm của hệ sau theo $ m$. $$\left\{ \begin{array}{lr}
    x + y = 4(1)&\\
    {x^2} + {y^2} = {m^2}&(2)
    \end{array} \right.$$

    Lời giải.

    • Nếu $ m=0$ thì hệ vô nghiệm.
    • Nếu $m \ne 0$ thì số nghiệm của hệ chính bằng số giao điểm của đường tròn ${x^2} + {y^2} = {m^2}$ và đường thẳng $\Delta 😡 + y = 4$
      Điều kiện cần và đủ là $$ d(O,\Delta)= \frac{{\left| { – 4} \right|}}{{\sqrt 2 }} = 2\sqrt 2 $$

    Vậy ta có:

    • Nếu $\left| m \right| < 2\sqrt 2 $ hệ vô nghiệm.
    • Nếu $m = \pm 2\sqrt 2 $ thì hệ có nghiệm duy nhất: $\left\{ \begin{array}{l}
      x = 2\\ y = 2 \end{array} \right.$
    • Nếu $\left| m \right| > 2\sqrt 2 $ thì hệ có hai nghiệm phân biệt.

    Bài 9: Tìm $ a$ để bất phương trình sau có nghiệm $$\sqrt {a – x} + \sqrt {x + a} > a(a > 0)$$
    Lời giải: Đặt $\left\{ \begin{array}{l}
    u = \sqrt {a + x} \\
    v = \sqrt {a – x}
    \end{array} \right.$ với điều kiện $u,v \ge 0$. Bất phương trình đã cho tương đương với hệ:
    $$\left\{ \begin{array}{lr}
    u + v > a&(1)\\
    {u^2} + {v^2} = 2a&(2)
    \end{array} \right.$$
    Làm tương tự các bài toán trước, đáp số là $ 0 < a < 4$.

  • Hàm trong Python

    Hàm trong Python

    Hàm trong Python

    1. Khái niệm hàm trong Python

    Trong lập trình, để thực hiện một công việc nào đó, và công việc này lặp đi lặp lại, chúng ta sử dụng hàm sẽ tiết kiệm được công sức. Chính bạn đã sử dụng một số hàm đã được xây dựng sẵn trong Python, ví dụ như hàm print(), type()

    Chẳng hạn, trong chương trình chúng ta có một nhiệm vụ là giải phương trình bậc hai năm lần, thì mỗi lần người dùng sẽ nhập vào các hệ số a, b, c từ bàn phím, chương trình sẽ giải phương trình với các hệ số đó và trả lại kết quả là vô nghiệm, có nghiệm kép hay hai nghiệm phân biệt và in các nghiệm đó. Nếu không sử dụng hàm ta phải đánh máy đoạn chương trình sau 5 lần!

    from math import sqrt
    
    a = int(input("a = "))
    b = int(input("b = "))
    c = int(input("c = "))
    d = b**2 – 4*a*c
    if d < 0:
          print("Phương trình vô nghiệm.")
    elif d == 0:
          print("Phương trình có nghiệm kép x = ", -b /(2*a))
    else:
          print("Phương trình có hai nghiệm ", (-b + sqrt(d))/(2*a), " và ",\   (-b - sqrt(d))/(2*a))

    Khi đó, chương trình trông sẽ dài dòng phức tạp, hơn nữa, mỗi lần giải một phương trình mới ta lại phải gõ lại đoạn mã  này, tính tái sử dụng không[1] có. Lúc này, chúng ta cần sử dụng đến hàm.

    2. Khai báo hàm trong Python

    Để khai báo một hàm trong Python chúng ta sử dụng từ khóa def với cú pháp:

    def name([arg,... arg=value,... *arg, **arg]):
        """Mô tả về hàm nếu (nên) có (phần này thường gọi là docstring)"""
        <khối lệnh>
        return [giá trị trả về]

    Trong đó name là tên của hàm, được đặt tên theo đúng quy tắc đặt tên và theo sau phải là cặp ngoặc tròn (). Bên trong cặp ngoặc tròn, ta có arg là các tham số nếu có, value là giá trị mặc định của tham số – nếu người dùng không cung cấp một giá trị cho tham số khi gọi hàm thì giá trị mặc định này sẽ được sử dụng, *arg**arg là các tham số kiểu tuple, tức một bộ các tham số.

    Một hàm trong Python có thể có tham số hoặc không. Cần lưu ý rằng, nếu hàm có tham số nhận các giá trị mặc định, thì các tham số này phải được khai báo sau các tham số không nhận giá trị mặc định. Chẳng hạn, khai báo hàm bậc hai y=a*x**2+b*x+c thì thường giá trị mặc định là a=1, nhưng ta không thể khai báo tham số a lên trước, mà bắt buộc phải khai báo tham số a cuối cùng, chẳng hạn

    def ham_bac_hai(b, c, a = 1):
        <khối lệnh thực thi hàm>

    Tiếp theo là dấu hai chấm : và xuống dòng để bắt đầu vào phần thân của hàm. Phần này có thể gồm chú thích mô tả về hàm để giúp cho các lập trình viên khác, và chính bản thân chúng ta sau này, hiểu rõ hơn về hàm và khối lệnh chính của hàm để thực hiện nhiệm vụ đề ra.

    Cuối cùng là từ khóa return để thoát khỏi hàm và trở về chương trình chính, hoặc trả về giá trị của hàm đối với hàm có giá trị trả về; phần này không bắt buộc phải có.

    Một hàm nếu được khai báo trong một lớp thì còn được gọi là một phương thức method của lớp.

    3. Lời gọi đến hàm trong Python

    Để gọi một hàm có tên là name đã được định nghĩa, ta sử dụng câu lệnh name(). Hãy quay trở lại ví dụ giải phương trình bậc hai để hiểu rõ hơn.

    from math import sqrt
    def giai_pt():
          a = int(input("a = "))
          b = int(input("b = "))
          c = int(input("c = "))
          d = b**2 – 4*a*c
          if d < 0:
                print("Phương trình vô nghiệm.")
          elif d == 0:
                print("Phương trình có nghiệm kép x = ", -b /(2*a))
          else:
                print("Phương trình có hai nghiệm ", (-b + sqrt(d))/(2*a),
                " và ", (-b – sqrt(d))/(2*a))

    Như vậy, hàm giai_pt ở trên không có tham số truyền vào và cũng không có kết quả trả về, bởi bản thân các lệnh trong hàm đã in ra nghiệm của phương trình rồi. Để gọi hàm này ta chỉ đơn giản là dùng câu lệnh giai_pt().

    Ở cách làm này, trong bản thân hàm đã có các câu lệnh để người dùng nhập vào giá trị của các hệ số a, b, c của phương trình. Nếu muốn truyền các hệ số khi gọi hàm giai_pt() ta có thể viết lại như sau:

    from math import sqrt
    def giai_pt(a, b, c):
          d = b**2 – 4*a*c
          if d < 0:
                print("Phương trình vô nghiệm.")
          elif d == 0:
                print("Phương trình có nghiệm kép x = ", -b /(2*a))
          else:
                print("Phương trình có hai nghiệm ", (-b + sqrt(d))/(2*a),\
                " và ", (-b – sqrt(d))/(2*a))

    Lúc này, để giải phương trình bậc hai với các hệ số a = 1, b = -3, c = 5 ta chỉ việc gọi hàm bằng cách sử dụng câu lệnh giai_pt(1, -3, 5).

    4. Giá trị trả về của hàm

    Hàm trong Python có thể có hoặc không có giá trị trả về. Điều này khác với các hàm số trong toán học bắt buộc phải nhận một giá trị trả về, thì hàm trong Python có thể chỉ thực hiện một nhiệm vụ nào đó như in ra màn hình một chuỗi, xóa hết các phần tử của một tập hợp…

    Trong trường hợp hàm có kết quả trả về ta sử dụng từ khóa return, theo sau là giá trị trả về của hàm. Khi đó hàm có thể được sử dụng như một biến để tính toán. Hãy xét một hàm đơn giản, tên là cong để cộng hai số nguyên ab, giá trị trả về chính là tổng của hái số đó, định nghĩa như sau:

    def cong(a, b):
          return a + b

    Chúng ta sẽ thử gọi hàm này với các tham số truyền vào  a = 3, b =7.

    >>> cong(3, 7)
    10
    >>> cong(3, 7) + 5
    15

    Nếu ta thực hiện chương trình này trong trình thông dịch Python, thì ở lần gọi hàm thứ nhất kết quả trả về là 10, ở lần gọi thứ hai, bản thân hàm được sử dụng như một biến số để thực hiện tiếp phép cộng, và kết quả trả về là 15.

    Tuy nhiên, nếu các bạn soạn một script có nội dung như sau

    def cong(a, b):
          return a + b
    
    cong(3, 7)
    cong(4, 7) + 5

    và lưu lại với tên có phần mở rộng .py rồi chạy script này thì kết quả là không xuất hiện gì cả trên màn hình! Lí do là chương trình vẫn tính a + b, và vẫn trả về kết quả này và được sử dụng để tính toán tiếp nhưng không được in ra màn hình. Lúc này, muốn in kết quả ra chúng ta phải sử dụng đến hàm print() của Python.

    def cong(a, b):
          return a + b
    
    print(cong(3, 7))
    print(cong(4, 7) + 5)

    Theo sau từ khóa return là một giá trị, một biểu thức, một câu lệnh, thậm chí lại là một hàm[2] hoặc không có gì cả. Nếu không có gì, thì chương trình chỉ đơn giản là thoát khỏi hàm mà thôi và trả về giá trị None. Mỗi khi gặp từ khóa return thì hàm sẽ kết thúc, chương trình sẽ thoát khỏi hàm và thực hiện câu lệnh tiếp theo. Hãy xem ví dụ sau để hiểu rõ hơn:

    def test():
          print(1)
          return
          print(2)

    Chúng ta sẽ chạy thử.

    >>> test()
    1
    >>> print(test())
    1
    None

    Ta thấy ngay, câu lệnh print(2) không được thực thi vì trước đó chương trình đã thực hiện lệnh return rồi. Hơn nữa, lệnh return này không trả về gì cả, nên nếu ta dùng lệnh print(test()) thì chương trình sẽ trả về kết quả None. Còn số 1 kia được in ra là do bản thân trong hàm có câu lệnh print(1) mà thôi.

    Bài tập

    • Viết hàm giải hệ phương trình bậc nhất hai ẩn, sử dụng định thức cấp hai.
    • Viết chương trình kiểm tra xem số tự nhiên n có phải là số nguyên tố không.
    • Viết chương trình tìm ước chung lớn nhất của hai số tự nhiên.

    5. Tham số của hàm trong Python

    Như đã nói, một hàm có thể có tham số hoặc không. Đối với hàm có tham số thì nếu số lượng tham số xác định, chúng ta có thể khai báo hết các tham số/đối số đó. Nhưng đối với các hàm có số lượng tham số chưa biết, ví dụ như tính tổng của một dãy số mà chưa biết dãy đó có bao nhiêu phần tử, thì chúng ta phải cần đến các tham số đặc biệt, khai báo với các dấu sao * trước danh sách tham số/đối số.

    Phần này có tham khảo từ blog https://icewolf-blog.herokuapp.com/post/8

     5.1. Cách truyền tham số dạng *args**kwargs trong python (abittrary arguments)

    Kiểu truyền tham số này thường được sử dụng khi định nghĩa những hàm không biết trước số lượng tham số truyền vào. Thực sự thì không nhất thiết phải là *args**kwargs, điều quan trọng là tham số có 1 dấu sao * hay là 2 dấu sao **. Đặt tên tham số là *var hay **vars hay bất cứ thứ gì bạn muốn. Nhưng để dễ hiểu thì nên dùng tên chuẩn là *args**kwargs

    5.2. *args**kwargs dùng để làm gì?

    Khi khai báo một hàm trong Python, sử dụng *args**kwargs cho phép bạn truyền vào nhiều tham số/đối số mà không cần biết trước số lượng.

    #giả sử các tham số truyền vào đều là số
    
    def sum(*args):
       total = 0
       for number in args:
         total += number
     return total
    
    # gọi hàm
    sum(1, 2, 3, 19)
    sum(1, 100)
    
    def myFun(*argv): 
        for arg in argv: 
            print (arg)
       
    myFun('Hello', 'Welcome', 'to', 'GeeksforGeeks')

    5.3. *args**kwargs khác gì nhau?

    Khi gọi hàm trong Python, có 2 kiểu truyền tham số:

    • Truyền tham số theo tên.
    • Truyền tham số bình thường theo thứ tự khai báo đối số.

    Ví dụ

    def register(name, password):
     ....
    
    #Truyền tham số theo kiểu thông thường, phải theo đúng thứ tự
    register( 'Coulson', 'hail_Hydra')
    
    #Truyền tham số theo tên, Không cần phải theo thứ tự khai báo thao số
    register( password='cookHim', name='Skye')
    • *args nhận các tham số truyền bình thường, sử dụng args như một list.
    • **kwargs nhận tham số truyền theo tên, sử dụng kwargs như một dictionary.
    def test_args(*args):
      for item in args:
         print item
    
    >>>test_args('Hello', 'world!')
    Hello
    world!
    
    def test_kwargs(*kwargs):
      for key, value in kwargs.iteritems():
         print '{0} = {1}'.format(key, value)
    
    >>test_kwargs(name='Dzung', age=10)
    age = 10
    name = Dzung

    5.4. Thứ tự sử dụng và truyền tham số *args, **kwargs và tham số bình thường

    Khi sử dụng hàm, ta phải khai báo đối số theo thứ tự ưu tiên đối số/tham số xác đinh, tiếp theo là *args và cuối cùng là **kwargs.  Đây là thứ tự bắt buộc. Và khi truyền tham số bạn cũng phải truyền theo đúng thứ tự này. Không thể truyền lẫn lộn giữa 2 loại.

    Khi sử dụng đồng thời *args**kwargs thì không thể truyền tham số bình thường theo tên

    def show_detail(name, *args, **kwargs):
    ...
    
    show_detail(name='Coulson', 'agent', age='40', level='A')
    >>> Lỗi
    
    def show_detail_2(name, **kwargs):
    ...
    
    show_detail_2(name=Coulson', age='40', level='A')
    >>> Chạy OK

    6. Lời gọi đệ quy đến hàm trong Python

    Một hàm có thể gọi lại chính nó, lúc này ta gọi là các lời gọi đệ quy[3] recursion.

    Ví dụ, cho cấp số cộng un với u1 = 5 và công sai d = 7 thì, chẳng hạn, muốn tìm số hạng thứ 20 ta lấy số hạng thứ 19 cộng thêm 7, nhưng muốn tính số hạng thứ 19 ta lại phải lấy số hạng thứ 18 cộng thêm 7 và cứ như thế cho đến số hạng thứ nhất thì đã có sẵn u1 = 5. Tổng quát, ta có công thức truy hồi như sau

    Nếu ta viết hàm cap_so_cong(n) để tính số hạng thứ n thì trong bản thân hàm này sẽ gọi lại chính nó với tham số truyền vào là n - 1:

    def cap_so_cong(n):
          if n == 1:
                return 5
          else:
                return cap_so_cong(n-1) + 7

    Lúc này, để tìm số hạng thứ n ta chỉ việc gọi hàm và truyền vào tham số n, chẳng hạn tính số hạng thứ 50 thì gọi hàm và truyền vào cho nó tham số n = 50, cap_so_cong(50):

    >>> cap_so_cong(50)
    348

    Một hàm có thể gọi lại chính nó nhiều lần, ví dụ, chúng ta xét dãy số Fibonacci

    Chúng ta có chương trình như sau

    def fibonacci(n):
          if n == 1 or n == 2:
                return 1
          else:
                return fibonacci(n-1) + fibonacci(n-2)

    Khi chạy chương trình, thử tìm số Fibonacci thứ 30 ta được kết quả

    >>> fibonacci(30)
    832040

    Tuy nhiên, trong lập trình, chúng ta nên hạn chế các lời gọi đệ quy, vì như thế chương trình sẽ cần rất nhiều bộ nhớ, chẳng hạn, ta tìm số Fibonacci thứ 100 thôi đã phải đợi rất lâu, vì bản thân mỗi lần gọi hàm, chương trình sẽ gọi lại chính nó hai lần và cứ như thế, do đó số lượng lời gọi hàm sẽ tăng lên rất nhiều với tốc độ cấp số nhân!

    Bài tập

    • Viết hàm cap_so_nhan(n) để tìm số hạng thứ n của một cấp số nhân với số hạng đầu bằng 7 và công bội bằng 2.
    • Viết hàm giai_thua(n) để tính giai thừa[4] của số tự nhiên n, chẳng hạn giai_thua(6) trả về kết quả 720.
    • Tìm tất cả các số tự nhiên hai chữ số mà khi đảo trật tự của hai chữ số đó sẽ thu được một số nguyên tố cùng nhau với số đã cho.
    • Tìm các số tự nhiên lẻ có ba chữ số. Ba chữ số này, theo trật tự từ trái qua phải tạo thành một cấp số cộng.
    • Tìm các số tự nhiên có ba chữ số. Ba chữ số này, theo trật tự từ trái qua phải tạo thành một cấp số nhân với công bội là một số tự nhiên khác 0.

    7. Biến toàn cục, biến cục bộ

    Trong Python không có sự phân biệt giữa tham số và tham số giá trị như trong ngôn ngữ khác, Pascal chẳng hạn, nên tất cả các giá trị được truyền vào một hàm chúng ta đều gọi là tham số của hàm. Ở đây, chúng ta chỉ cần phân biệt khái niệm biến toàn cục global và biến cục bộ (biến địa phương) local mà thôi.

    Một biến được định nghĩa bên trong một hàm chỉ có thể được sử dụng bên trong hàm đó và được gọi là biến cục bộ. Các tham số và biến cục bộ này chỉ được phép sử dụng bởi các lệnh nằm bên trong hàm. Khi hàm được thực thi thì biến sẽ tồn tại và sẽ bị hủy khi chúng ta thoát khỏi hàm.

    a = 1
    def bien_cuc_bo(a):
        a = 5
        print(a)
    
    bien_cuc_bo(a) # chương trình  trả về kết quả là 5
    print(a) #chương trình vẫn trả về kết quả là 1

    Nhưng nếu như biến mà có kiểu dữ liệu là list thì những thay đổi bên trong hàm sẽ được giữ lại.

    a = [0, 5, 10, 15]
    def bien_cuc_bo(a):
        a[1] = 100
        print(a)
    
    bien_cuc_bo(a) # chương trình  trả về kết quả là [0, 100, 10, 15]
    print(a) #chương trình vẫn trả về kết quả là [0, 100, 10, 15]

    Để ghi nhận lại những thay đổi giá trị của một biến do các câu lệnh bên trong hàm tạo nên, chúng ta có thể sử dụng từ khóaglobal (biến toàn cầu, biến toàn cục). Khi một biến được khai báo là global thì chúng ta có thể gọi và thay đổi giá trị của nó từ bất kỳ đâu trong chương trình, kể cả trong thân hàm. Lưu ý rằng biến toàn cục chỉ có thể khai báo bên trong hàm và nó không thể là tham số/đối số của hàm.

    Như ví dụ sau, biến a lúc đầu có giá trị là 1, và trong hàm a được khai báo global đồng thời nhận giá trị mới là 5 thì ra bên ngoài hàm, giá trị mới này vẫn được ghi lại chứ không như ví dụ trước.

    a = 1
    def bien_toan_cuc():
       global a
       a = 5
       print(a)
    
    bien_toan_cuc() # chương trình  trả về kết quả là 5
    print(a) #chương trình vẫn trả về kết quả là 5

    8. Hàm nặc danh

    Chúng ta sử dụng từ khoá lambda được dùng để tạo một hàm số nặc danh (một hàm số không có tên). Nó là một hàm số trên một dòng và không có câu lệnh return. Nó chỉ bao gồm một biểu thức mà kết quả của biểu thức này chính là giá trị trả về của hàm. Ví dụ:

    a = lambda x: x*2
    for i in range(1,6):
          print(a(i))

    Kết quả

    2
    4
    6
    8
    10

    Ở đây, chúng ta tạo ra một hàm số chỉ trong một dòng lệnh, nó được dùng để nhân đôi giá trị của đối số nhận vào, sử dụng câu lệnh lambda. Sau đó, chúng ta dùng hàm này để nhân đôi các giá trị của một danh sách các số nguyên từ 1 đến 5.

    Mời bạn xem chi tiết trong bài Hàm ẩn danh trong Python

    [1]Bạn chỉ có thể tái sử dụng bằng cách Copy – Paste mà thôi 🙂

    [2]Xem phần đệ quy hàm để rõ hơn.

    [3]Thực ra, thử tìm hiểu từ đệ quy thì thấy rất khó hiểu, ta cứ hiểu nôm na như là phép quy nạp trong Toán học.

    [4]Giai thừa của một số tự nhiên n, kí hiệu là n!, được tính bởi công thức

  • Kiểu dữ liệu tập hợp set trong Python

    Kiểu dữ liệu tập hợp set trong Python

    Kiểu dữ liệu tập hợp set trong Python

    Trong toán học, là khái niệm không thể định nghĩa. Ta hiểu tập hợp như sự tụ tập các đối tượng nào đó, mà ta gọi là các phần tử. Kiểu dữ liệu tập hợp set trong Python cũng giống như vậy, là một tập các phần tử trong đó mỗi phần tử chỉ xuất hiện đúng một lần. Hiểu đơn giản như kể tên các học sinh trong một lớp, mỗi học sinh đương nhiên chỉ được kể một lần, và ta không cần theo thứ tự nào cả; lúc này, ta cần đến kiểu tập hợp.

    1. Cách khai báo kiểu tập hợp set trong Python

    Để tạo một tập hợp set ta có cú pháp khá giống với kiểu từ điển dictionary, với các phần tử trong cặp ngoặc nhọn cách nhau bởi dấu phẩy. Tuy nhiên, mỗi phần tử của set là một giá trị (thay cho một cặp giá trị như với dictionary), ví dụ:

    >>> A = {1, 7, 2, 6, 4, 5}
    >>> my_set = {1.0, "Hello", (1, 2, 3)}
    >>> my_set
    {1.0, 'Hello', (1, 2, 3)}

    Kiểu tập hợp set trong Python có các đặc điểm sau:

    • Các phần tử của tập hợp được đặt trong cặp ngoặc nhọn {} các phần tử phân cách bởi dấu phẩy ,.
    • Mỗi phần tử chỉ xuất hiện một lần cho dù bạn có nhập nó nhiều lần.
    • Kiểu tập hợp set cũng có các phép lấy hợp, lấy giao như trong Toán học.
    • Để tạo một tập hợp s rỗng, bạn cần dùng hàm không có thông số s = set(). Vì sử dụng s = {} sẽ tạo một từ điển dictionary rỗng.

    Tập hợp set là dữ liệu thay đổi được mutable, tuy nhiên bản thân mỗi phần tử trong set thì lại không thể thay đổi immutable được. Tức là, các phần tử của một set chỉ có thể là các kiểu dữ liệu không thay đổi được immutable như các kiểu số, kiểu chuỗi… mà không thể là kiểu danh sách, từ điển. Như ví dụ sau, chúng ta cố gắng gán một phần tử của tập my_set là một danh sách [3, 4] thì Python báo lỗi kiểu dữ liệu ngay lập tức.

    >>> my_set = {1, 2, [3, 4]}
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'list'

    Python cũng có loại tập hợp không thay đổi được immutable set gọi là frozenset.

    Truy cập các phần tử của một tập hợp set trong Python

    Bạn không thể truy cập các phần tử trong một tập hợp bằng cách sử dụng chỉ mục index như kiểu danh sách list, nhưng bạn có thể duyệt qua lần lượt các phần tử của nó bằng cách sử dụng vòng lặp for  cùng với toán tử in để kiểm tra một đối tượng nào đó có thuộc về tập hợp đã cho không.

    >>> thisset = {"apple", "banana", "cherry"}
    >>> for x in thisset:
    ...     print(x)
    ...
    cherry
    banana
    apple

    2. Các toán tử và phương thức trên kiểu tập hợp set

    Giả sử S, S1S2 là các tập hợp, x là một phần tử:

    2.1. Toán tử in

    Sử dụng cú pháp x in S để kiểm tra phần tử x có nằm trong tập S hay không. Trả về kết quả True nếu tập S chứa phần tử x, False nếu S không chứa x.

    >>> S = {1, 3, 2, 8, 10}
    >>> 1 in S
    True
    >>> 4 in S
    False

    2.2. Hàm len()

    Hàm len(S)trả về số lượng phần tử của tập S, kết quả trả về là một số nguyên không âm.

    >>> S = {1, 3, 2, 8, 10}
    >>> len(S)
    5
    >>> A = set() #tập A là tập rỗng
    >>> len(A)
    0

    2.3. Các phương thức add, remove, discard, pop, clear

    • Phương thức <tap_hop>.add(x) sẽ thêm phần tử x vào tập <tap_hop>.
    • Phương thức <tap_hop>.update(<danh_sách>)sẽ thêm các phần tử của <danh_sách> vào <tập_hợp>. Có thể thay <danh_sách> bởi các dữ liệu kiểu liệt kê như tập hợp set, bộ tuple
    • Phương thức <tap_hop>.remove(x)<tap_hop>.discard(x) sẽ xóa phần tử x khỏi tập <tap_hop>.
    • Phương thức <tap_hop>.pop() trả về phần tử đứng đầu tiên trong tập <tap_hop> đồng thởi xóa phần tử đó khỏi tập <tap_hop>.
    >>> thisset = {2, 'banana', 'cherry', 'apple', 1, 3}
    >>> thisset
    {1, 2, 3, 'banana', 'cherry', 'apple'}
    >>> thisset.pop()
    1
    >>> thisset.pop()
    2
    >>> thisset.pop()
    3
    >>> thisset.pop()
    'banana'

    Chú ý rằng, tập hợp không được đánh chỉ mục nên bạn sẽ không thể biết được phần tử nào đứng đầu tiên, Python có quy luật riêng để quyết định phần tử nào đứng đầu tiên. Như trong ví dụ trên, bạn nhập vào phần tử 2 đầu tiên, nhưng Python lại lưu trong bộ nhớ phần tử 1 ở vị trí đầu tiên.

    • Phương thức <tap_hop>.clear() xóa tất cả các phần tử của tập <tap_hop>.
    >>> S = {1, 2, 3, 4, 5, 6}
    >>> S.add(100) #Thêm phần tử 100 vào tập S
    >>> S
    {1, 2, 3, 4, 5, 6, 100}
    >>> S.remove(1) #Xóa phần tử 1 khỏi tập S
    >>> S
    {2, 3, 4, 5, 6, 100}
    >>> S.pop() #Lấy ra phần tử đầu tiên của tập hợp
    2
    >>> S
    {3, 4, 5, 6, 100}
    >>> S.discard(6)
    >>> S
    {3, 4, 5, 100}
    >>> S.clear() #Xóa hết mọi phần tử của S, lúc này S trở thành rỗng
    >>> S
    set()

    Chú ý rằng hai thủ tục remove(x)discard(x) cùng xóa đi phần tử x, nhưng sự khác nhau ở đây là nếu tập S không tồn tại phần tử x thì phương thức:

    • remove(x) sẽ trả về kết quả None.
    • discard(x) sẽ trả về lỗi KeyError.

    Hãy xem ví dụ sau để hiểu rõ hơn.

    >>> S = {'a', 'b', 'c', 'd'}
    >>> S.discard('e') #Không hiển thị gì, dùng print để xem kết quả
    >>> print(S.discard('e'))
    None
    >>> S.remove('e')
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    KeyError: 'e'

    2.3. Các phép toán trên kiểu tập hợp set trong Python

    Phép lấy hiệu hai tập hợp set trong Python

    Phép lấy hiệu hai tập hợp S1S2, sử dụng cú pháp S1-S2 hoặc S1.difference(S2). Kết quả trả về là một tập mới chứa các phần tử thuộc tập S1 và không thuộc tập S2. Một phép toán tương tự là S1.symmetric_difference(S2) hoặc S1^S2 có tác dụng như S2 – S1.

    >>> S1 = {1, 2, 3, 4, 5, 6}
    >>> S2 = {0, 2, 4, 6, 8, 10}
    >>> S1 – S2
    {1, 3, 5} #Hiệu của tập S1 và S2

    Phép lấy hợp hai tập hợp set trong Python

    Sử dụng cú pháp S1|S2 hoặc S1.union(S2) để lấy hợp hai tập hợp S1S2. Kết quả trả về một tập mới chứa tất cả các phần tử thuộc tập S1 và tất cả các phần tử thuộc tập S2. Đương nhiên, nếu phần tử nào đó thuộc cả hai tập hợp thì chỉ được kể một lần.

    >>> S1 = {1, 2, 3, 4, 5, 6}
    >>> S2 = {0, 2, 4, 6, 8, 10}
    >>> S1|S2
    {0, 1, 2, 3, 4, 5, 6, 8, 10} #Hợp của S1 và S2

    Phép lấy giao hai tập hợp set trong Python

    Sử dụng cú pháp S1 & S2 hoặc S1.intersection(S2) để lấy giao hai tập hợp S1S2. Kết quả trả về một tập mới chứa tất cả các phần tử thuộc đồng thời cả hai tập S1S2. Tức là các phần tử chung của hai tập hợp đó.

    >>> S1 = {1, 2, 3, 4, 5, 6}
    >>> S2 = {0, 2, 4, 6, 8, 10}
    >>> S1&S2
    {2, 4, 6} #Giao của S1 và S2 gồm ba phần tử 2, 4, 6

    Toán tử kiểm tra tập con

    Để kiểm tra tập S1 có là tập con của S2 hay không, ta sử dụng cú pháp S1<= S2 hoặc S1.issubset(S2). Kết quả trả về là kiểu Boolean True nếu đúng và False nếu sai. Nhắc lại rằng, tập S1 là tập con của S2 nếu mọi phần tử của S1 đều là phần tử của S2 (tức là cũng thuộc tập S2).

    >>> S1 = {1, 2, 3, 4, 5, 6, 7}
    >>> S2 = {1, 2, 5}
    >>> S3 = {1, 2, 5, 9}
    >>> S4 = set()
    >>> S1.issubset(S1) #Mọi tập đều là tập con của chính bản thân nó
    True
    >>> S2.issubset(S1)
    True
    >>> S3.issubset(S1)
    False
    >>> S4.issubset(S1) #Tập rỗng là tập con của mọi tập hợp
    True

    Ngược lại của tập con, chúng ta có thể sử dụng S1 >= S2 hoặc S1.issupperset(S2) để kiểm tra S1 có là tập cha của (tức là có chứa) S2 hay không, trả về True nếu đúng và False nếu sai. Tập S1 là tập cha của S2 nếu mọi phần tử của S2 đều thuộc tập S1.

    >>> S1 = {1, 2, 3, 4, 5, 6, 7}
    >>> S2 = {1, 2, 5}
    >>> S3 = {1, 2, 5, 9}
    >>> S4 = set()
    >>> S1.issupperset(S1) #Mọi tập đều là tập cha của chính bản thân nó
    True
    >>> S1.issupperset(S2)
    True
    >>> S1.issupperset(S3)
    False
    >>> S1.issupperset(S4)
    True

    Tập con thực sự, tập cha thực sự

    Sử dụng cú phsp S1<S2S1>S2 để kiểm tra S1 có là tập con thực sự, tập cha thực sự của S2 hay không. Tập S1 là tập con thực sự của S2 nếu S1 là tập con của S1 nhưng S1S2 không bằng nhau. Tương tự đối với khái niệm tập cha thực sự.

    3. Bài tập kiểu tập hợp set trong Python

    Bài 1. Cô giáo Thảo thống kê chiều cao của các học sinh trong lớp 12A được kết quả như sau:

    161 182 161 154 176 170 167 171 170 174 150 142 148
    165 170 178 156 145 149 163 162 159 165 165 170 180
    155 159 155 153 152 162 180 168 169 168 167 170
    1. Hỏi lớp có bao nhiêu học sinh?
    2. Tính chiều cao trung bình của các học sinh trong lớp.
    3. Liệt kê các chiều cao khác nhau của học sinh trong lớp. Tính giá trị trung bình của chúng.

    Bài 2. Liệt kê tập hợp S gồm các kí tự của câu sau, kể cả dấu cách trắng:

    Mọc giữa dòng sông xanh
    Một bông hoa tím biếc
    Ơi con chim chiền chiện
    Hót chi mà vang trời
    Từng giọt long lanh rơi
    Tôi đưa tay hứng về.

    Tập hợp S có bao nhiêu phần tử. Thêm vào tập S các phần tử là các kí tự xuất hiện trong câu sau
    tôi rất nghèo tiền bạc, chỉ giàu thời gian thôi.

    Bài 3. Cho tập hợp A gồm có các phần tử sau, mỗi phần tử cách nhau bởi dấu cách trắng:

    1 a 5 7 f 0 89 g i 11 88 3 p

    Liệt kê các tập con có hai phần tử của tập hợp A. Có tất cả bao nhiêu tập con như vậy.

    Bài 4. Một lớp có 40 học sinh trong đó có 10 bạn học tiếng Pháp, 14 bạn học tiếng Anh, 6 bạn học cả hai thứ tiếng đó. Hỏi có bao nhiêu học sinh không học tiếng Pháp mà cũng không học tiếng Anh.

    Bài 5.  Trong một lớp học mỗi học sinh đều chơi thể bóng đá hoặc bóng chuyền. Có 25 học sinh chơi bóng đá, 27 học sinh chơi bóng chuyền và 18 học sinh chơi cả hai. Hỏi lớp đó có bao nhiêu học sinh?

  • Kiểu dữ liệu list danh sách trong Python

    Kiểu dữ liệu list danh sách trong Python

    Kiểu dữ liệu list danh sách trong Python

    Danh sách trong Python kí hiệu là list, hiểu đơn là một tập hợp các đối tượng có chung một tính chất nào đó. Ví dụ danh sách các món ăn trên bàn tiệc, danh sách các bài hát của một album, danh sách học sinh trong một lớp học…

    Ta thấy ngay, mỗi danh sách đều gồm có các phần tử khác nhau, để liệt kê chúng, chẳng hạn liệt kê các thực phẩm cần mua cho bữa liên hoan, bạn sẽ sử dụng dấu phẩy để ngăn cách các phần tử này. Python cũng vậy, tuy nhiên, các danh sách các phần tử cần được đặt trong cặp ngoặc vuông [].

    1. Giới thiệu kiểu danh sách trong Python

    Để khai báo một danh sách, chúng ta dùng liệt kê các phần tử của danh sách, được đặt trong cặp ngoặc vuông [], các phần tử được ngăn cách nhau bởi dấu phảy ,. Mỗi phần tử trong danh sách có thể có kiểu bất kỳ như str, float, hay int

    Ví dụ sau tạo một danh sách mon_an gồm có các phần tử kiểu xâu str là các món canh cua, cà pháo, cá khothịt rán.

    >>> mon_an = ['canh cua', 'ca phao', 'ca kho', 'thit ran']

    Một danh sách không có thể phần tử, gọi là danh sách rỗng.

    >>> ban_gai = []
    >>> ban_gai
    []

    Để truy cập vào một phần tử của danh sách list trong Python, ta dùng tên danh sách theo sau là chỉ số index của phần tử đó được đặt trong cặp ngoặc vuông.

    >>> mon_an[3]
    'thit ran'

    Cũng giống như kiểu xâu str, các chỉ số index của một danh sách list được đánh số bắt đầu từ 0. Kiểu danh sách có thể hiểu gần giống như kiểu mảng array trong các ngôn ngữ lập trình khác.

    Không như kiểu xâu str, là những đối tượng immutable, thì kiểu danh sách là đối tượng mutable, tức ta có thể thay đổi các phần tử của một danh sách. Chẳng hạn, thay cà pháo bằng dưa muối, ta sẽ gán giá trị mới cho phần tử mon_an[1].

    >>> mon_an[1] = 'dua muoi'
    >>> mon_an
    ['canh cua', 'dua muoi', 'ca kho', 'thit ran']

    2. Các phép toán và phương thức của kiểu danh sách

    Cũng giống như kiểu xâu str, kiểu danh sách list cũng có các phép toán và phương thức đặc thù. Chúng ta sẽ lần lượt tìm hiểu các toán tử và phương thức/hàm của kiểu danh sách trong Python.

    2.1. Toán tử in

    Toán tử in dùng để kiểm tra xem một phần tử có nằm trong danh sách hay không, kết quả trả về của toán tử này là kiểu boolean đúng True hoặc sai False.

    >>> mon_an = ['canh cua', 'ca phao', 'ca kho', 'thit ran']
    >>> 'canh cua' in mon_an
    True
    >>> 3000 in mon_an
    False

    Bạn cũng có thể sử dụng toán tử in để duyệt danh sách trong vòng lặp for như sau.

    >>> for i in mon_an:
    ...     print(i)
    ...
    canh cua
    ca phao
    ca kho
    thit ran

    2.2. Toán tử +

    Toán tử + cho phép ghép nối hai danh sách với nhau. Lưu ý rằng toán tử + này tương tự phép cộng hai xâu (chuỗi, string) chứ không giống như toán tử cộng các số.

    >>> a = [1, 2, 3]
    >>> b = ['x', 'y', 'z', 'a']
    >>> a + b
    [1, 2, 3, 'x', 'y', 'z', 'a']

    2.3. Toán tử *

    Tương tự toán tử * dùng để lặp lại các phần tử trong danh sách lên k lần.

    >>> a = [0] * 4
    >>> a
    [0, 0, 0, 0]

    2.4. Phương thức append()

    Phương thức <ds>.append(<pt>) này sẽ thêm phần tử <pt> vào cuối danh sách <ds>.

    >>> ds = [1, 2, 3, 4]
    >>> ds.append(5)
    >>> ds
    [1, 2, 3, 4, 5]

    2.5. Phương thức extend()

    Phương thức <ds1>.extend(<ds2>) này sẽ thêm các phần tử của danh sách <ds2> vào cuối của danh sách <ds1>

    >>> l1 = [1, 2, 3]
    >>> l2 = [4, 5, 6, 7]
    >>> l1.extend(l2)
    >>> print(l1)
    [1, 2, 3, 4, 5, 6, 7]

    2.6. Phương thức sort()

    Phương thức <ds>.sort() giúp sắp xếp các phần tử của danh sách <ds> theo thứ tự phần tử từ nhỏ đến lớn, đối với kiểu chuỗi thì sắp theo thứ tự alphabet. Lưu ý rằng các phần tử của danh sách phải thuộc cùng một kiểu dữ liệu, cùng kiểu chuỗi hoặc cùng kiểu số…, tức là các phần tử của danh sách phải so sánh được với nhau.

    >>> ds_so = [1, 5, 7, 3, 2, 9]
    >>> ds_so.sort()
    >>> ds_so
    [1, 2, 3, 5, 7, 9]
    >>> ds_xau = ['a', 'e', 'b', 'g', 'i', 'Aa']
    >>> ds_xau.sort()
    >>> ds_xau
    ['Aa', 'a', 'b', 'e', 'g', 'i']

    2.7. Phương thức pop()

    Phương thức <ds>.pop(i) xóa phần tử có chỉ số i của danh sách <ds>, kết quả trả về chính là giá trị của phần tử có chỉ số i đó. Nhắc lại rằng, các phần tử của danh sách được đánh chỉ số từ 0

    >>> ds = [1, 5, 7, 3, 2, 9]
    >>> ds.pop(1)
    5
    >>> ds
    [1, 7, 3, 2, 9]

    2.8. Toán tử del

    Toán tử del <ds>[i] để xóa phần tử có chỉ số i của danh sách <ds> hoặc del <ds>[i:j] một phần của danh sách từ chỉ sối đến chỉ số j.

    >>> ds = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> del ds[0]
    >>> ds
    [2, 3, 4, 5, 6, 7, 8, 9]
    >>> del ds[1:3]
    >>> ds
    [2, 5, 6, 7, 8, 9]

    2.9. Phương thức remove()

    Phương thức pop() xóa bỏ phần tử của danh sách dựa trên chỉ số của phần tử đó, thì phương thức <ds>.remove(<pt>) sẽ xóa bỏ phần tử có giá trị <pt> đầu tiên của danh sách <ds> khỏi danh sách đó. Giá trị trả về của phương thức remove()None.

    ds = [1, 2, 3, 4, 5, 6, 7, 8, 8, 9]
    >>> ds.remove(8)
    >>> ds
    [1, 2, 3, 4, 5, 6, 7, 8, 9]

    Nếu bạn muốn xóa bỏ tất cả các phần tử có giá trị <pt> khỏi danh sách <ds>, có thể làm như sau:

    >>> ds = [1, 2, 3, 4, 5, 6, 7, 8, 8, 9]
    >>> while 8 in ds: ds.remove(8)
    >>> ds
    [1, 2, 3, 4, 5, 6, 7, 9]

    3. Xử lý danh sách trong Python

    Các thao tác thường được thực hiện trên list trong Python là xử lý từng phần tử của list, lọc lấy một số phần tử thỏa điều kiện nào đó, tính toán trên tất cả các phần tử của list.

    Để đơn giản việc xử lý danh sách list, Python hỗ trợ một số hàm có sẵn để thực hiện các tác vụ trên gồm map(), filter(), reduce()

    3.1. Hàm map() để xử lý danh sách trong Python

    Sử dụng câu lệnh map(func, seq) sẽ áp dụng hàm func cho mỗi phần tử của seq và trả về list kết quả.

    Ví dụ, tính bình phương các số có trong list a sử dụng map():

    a = [1, 2, 3, 4, 5]
    def binh_phuong(x):
       return x*x
    print(list(map(binh_phuong,a)))

    Có thể sử dụng hàm nặc danh lamda thay vì viết riêng một hàm binh_phuong.

    >>> a = [1, 2, 3, 4, 5]
    >>> print(list(map(lambda x: x*x, a)))
    [1, 4, 9, 16, 25]

    Thêm một ví dụ nữa, chúng ta sẽ cộng tương ứng từng phần tử của hai danh sách có cùng số lượng phần tử:

    numbers1 = [1, 2, 3] 
    numbers2 = [4, 5, 6] 
      
    result = map(lambda x, y: x + y, numbers1, numbers2) 
    print(list(result))

    3.2. Hàm filter() xử lý kiểu dữ liệu danh sách trong Python

    Hàm filter(func, list) sẽ  lần lượt gọi hàm func với tham số lần lượt là từng phần tử của danh sách list và trả về danh sách gồm các phần tử thỏa mãn hàm func. Lưu ý rằng hàm func phải là hàm mà kết quả trả về thuộc kiểu Boolean True hoặc False, tức là hàm func như là một hàm điều kiện để lọc ra các phần tử của danh sách list thỏa mãn điều kiện đó.

    Ví dụ lọc ra các số chẵn từ danh sách a.

    a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    def so_chan(number):
       if number % 2 == 0:
          return True
       else:
          return False
    
    print (list(filter(so_chan, a)))

    Hoặc, sử dụng hàm nặc danh lambda, ta có thể viết chương trình gọn hơn như sau:

    >>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> print (list(filter(lambda x: x%2 == 0, a)))
    [2, 4, 6, 8]

    Thêm một ví dụ nữa, sử dụng hàm filter() để in ra các nguyên âm trong một danh sách:

    def nguyen_am(x): 
        ds_nguyen_am = ['a', 'e', 'i', 'o', 'u'] 
        if (x in ds_nguyen_am): 
            return True
        else: 
            return False
    
    ds = ['g', 'e', 'e', 'j', 'k', 's', 'p', 'r'] 
      
    kq = filter(nguyen_am, ds) 
    
    for s in kq: 
        print(s)

    3.3. Hàm reduce() xử lý kiểu dữ liệu danh sách trong Python

    Hàm reduce(func, <ds>) sẽ tính toán, áp dụng hàm func với các phần tử của danh sách và trả về kết quả của.

    Hàm func là một hàm nhận vào 2 tham số có dạng func(arg1, arg2) trong đó arg1 là kết quả tính toán với các phần tử trước, arg2 là giá trị của phần tử của danh sách đang được tính toán.

    Cách thức hoạt động của hàm reduce() chi tiết như sau:

    • Ở bước đầu tiên, hai phần tử đầu tiên của danh sách <ds> được lấy và cung cấp cho hàm func thu được một kết quả kq.
    • Bước tiếp theo, hàm func nhận tham số là kết quả kq đạt được ở bước trước và phần tử tiếp theo của danh sách <ds>, kết quả tính toán lại được sử dụng như một tham số cho bước tiếp theo.
    • Quá trình này tiếp tục cho đến khi không còn phần tử nào trong danh sách <ds>.
    • Kết quả trả về của hàm reduce() là kết quả ở bước cuối cùng của hàm func.

    Lưu ý rằng, hàm reduce nằm trong thư viện functools, nên cần phải khai báo import functools trước khi sử dụng hàm reduce().

    Ví dụ sau in ra tổng các giá trị của danh sách và phần tử lớn nhất của danh sách.

    from functools import *
      
    ds = [ 1 , 3, 5, 6, 2, ] 
    
    print ("Tong cac phan tu cua danh sach la: ",end="") 
    print (reduce(lambda a,b : a+b, ds)) 
      
    
    print ("Phan tu lon nhat cua danh sach la: ",end="") 
    print (reduce(lambda a,b : a if a > b else b, ds))

    Ví dụ tính tổng bình phương của các phần tử trong danh sách a

    a = [1, 2, 3, 4, 5]
    
    def tong_binh_phuong(kq, x):
       return kq + x*x
    
    print(reduce(tong_binh_phuong, a))

    4. Danh sách của danh sách, kiểu danh sách nhiều chiều trong Python

    Các phần tử của một danh sách danh sách trong Python lại có thể là một danh sách, chẳng hạn

    >>> A = [[1,2,3], [4,5,6], [7,8,9,10,11]]
    >>> A[1]
    [4, 5, 6]
    >>> A[1][2]
    6
    >>> A[2][4]
    11
    >>> A[1][5]
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    IndexError: list index out of range

    Danh sách A gồm có ba phần tử, mỗi phần tử lại là một danh sách [1,2,3], [4,5,6], [7,8,9,10,11]. Khi đó, để truy cập đến phần tử j của danh sách A[i] nằm trong danh sách  A ta dùng cú pháp A[i][j].

    Kiểu dữ liệu này tương ứng với kiểu mảng hai chiều array, hoặc là ma trận, trong các ngôn ngữ khác. Tuy nhiên, nếu một ma trận thì, nếu xét riêng từng dòng, bắt buộc các dòng phải có số cột như nhau. Nhưng ở đây thì khác, nếu ta viết lại list A ở trên, mỗi phần tử viết trên một dòng thì ta sẽ có dạng gần giống ma trận, do số cột của từng dòng là khác nhau

    [1,2,3]
    [4,5,6]
    [7,8,9,10,11]

    Rõ ràng, kiểu danh sách của danh sách này linh hoạt hơn – nhưng cũng đồng nghĩa với khó kiểm soát hơn – kiểu mảng hai chiều trong các ngôn ngữ khác.

    5. Danh sách và chuỗi

    Bạn có thể kết hợp danh sách và chuỗi để tách các ký tự trong chuỗi thành một danh sách, sử dụng hàm ép kiểu list() như sau.

    >>> s = 'phan van phuong'
    >>> list(s)
    ['p', 'h', 'a', 'n', ' ', 'v', 'a', 'n', ' ', 'p', 'h', 'u', 'o', 'n', 'g']
    Hoặc có thể tách một chuỗi thành danh sách gồm các phần tử cách nhau bởi <kí_tự_tách> bằng hàm split(<kí_tự_tách>), mặc định <kí_tự_tách> là khoảng trắng.
    >>> s = 'phan van phuong'
    >>> s.split()
    ['phan', 'van', 'phuong']
    >>> s.split('n')
    ['pha', ' va', ' phuo', 'g']

    6. Bài tập kiểu list danh sách trong Python

    Bài 1. Cho một list các số nguyên. Viết chương trình tìm phần tử lớn nhất của list đó.

    Bài 2. Cho một list các số nguyên. Viết chương trình in ra tất cả các phần tử lớn là số chẵn và lớn hơn 10 của list đó.

    Bài 3. Viết chương trình tính số trung bình các giá trị của một list số nguyên.

    Bài 4. Tạo một list gồm n số nguyên không âm ngẫu nhiên.

    Xem thêm về các kiểu dữ liệu list (danh sách trong Python) tại https://www.w3schools.com/python/python_lists.asp

  • Chuỗi trong Python (Kiểu xâu string trong Python)

    Chuỗi trong Python (Kiểu xâu string trong Python)

    Kiểu xâu trong Python kí hiệu là str, nó còn được gọi là kiểu chuỗi trong Python. Đây là một kiểu dữ liệu chúng ta thường gặp nhất, dùng để biểu thị các kí tự, các từ, các câu văn… Tải ebook đầy đủ tại đây: 15 Cuốn sách học Python miễn phí

    Xem thêm:

    1. Giới thiệu về string – chuỗi trong Python

    • Để tạo một string, chúng ta có thể dùng một cặp dấu nháy đơn ', cặp dấu nháy kép " hoặc cặp ba dấu nháy kép""".
    • Chuỗi 'xin chào' cũng giống như "xin chào" dù bạn có dùng cặp dấu nháy đơn hay nháy kép.
    • Khi dùng ba dấu nháy kép, chúng ta có thể viết stringchuỗi trong Python trên nhiều dòng mà không cần dùng ký tự thoát \. Lưu ý rằng, cặp dấu nháy dùng để mở và đóng chuỗi này phải cùng loại, cùng là nháy đơn, cùng là nháy kép chẳng hạn, không được trộn lẫn.
    >>> a = 'Xin chao'
    >>> a
    'Xin chao'
    >>> b = "Toi la Phu Ong"
    >>> b
    'Toi la Phu Ong'
    >>> c = """Day la string
    ... tren
    ... nhieu dong"""
    >>> c
    'Day la string\ntren\nnhieu dong'
    • Để sử dụng dấu nháy trong một string, bạn có thể bao nó bằng một cặp dấu nháy khác loại. Chẳng hạn muốn sử dụng dấu nháy kép, thì bạn đặt cả string đó vào trong cặp nháy đơn và ngược lại.
    >>> "I'm Phuong."
    "I'm Phuong."

    Một cách khác là sử dụng kí tự điều khiển \, chẳng hạn

    >>> 'I\'m Phuong'
    "I'm Phuong"
    >>> '\'\"'
    '\'"

    2. Gán chuỗi cho một biến

    Việc gán một chuỗi trong Python cho một biến được thực hiện với tên biến theo sau là dấu bằng và chuỗi, ví dụ

    >>> a = "Hello"
    >>> print(a)
    Hello

    3. Chỉ số index và cắt lát slice() chuỗi trong Python

    Giống như các ngôn ngữ lập trình khác, chuỗi trong Python cũng được đánh chỉ số của các kí tự từ 0. Chẳng hạn

    >>> s = "Phuong"
    >>> s[0]
    'P'
    >>> s[1]
    'h'

    Như ta thấy, xâu “Phuong” gồm có 6 kí tự, và kí tự đầu tiên là ‘P‘ ở vị trí s[0] chứ không phải là s[1].

    Để lấy ra một xâu con của xâu <string>, chúng ta sẽ chỉ ra chính xác vị trí bắt đầu và kết thúc của xâu con, sử dụng cú pháp

    <string>[i:j]

    trong đó, i là vị trí bắt đầu còn j là vị trí kết thúc của xâu con.

    s = '1234567abcde'
    >>> s[1:6]
    '23456'

    Nếu muốn lấy từ vị trí đầu tiên, ta có thể lược bỏ tham số i, còn muốn lấy đến vị trí cuối cùng của xâu ta có thể lược bỏ tham số j.

    >>> s = '1234567abcde'
    >>> s[:6]
    '123456'
    >>> s[6:]
    '7abcde'
    >>> s[:]
    '1234567abcde'

    Đấy là trong trường hợp chúng ta lấy theo chiều tăng của index, còn muốn lấy theo chiều giảm của chỉ số hoặc muốn lấy các kí tự ở những vị trí cách quãng nhau, ta dùng cú pháp

    <string>[i:j:k]

    trong đó, i là vị trí bắt đầu, j là vị trí kết thúc còn k là bước nhảy (có thể là số âm – để lấy theo chiều giảm của index).

    >>> s = '1234567abcde'
    >>> s[1:5:2]
    '24'
    >>> s[6:0:-1]
    '765432'

    Do đó, muốn đảo ngược một xâu, ta chỉ cần đơn giản là dùng cách lấy toàn bộ xâu đó với bước nhảy k bằng -1.

    >>> s = '1234567abcde'
    >>> s[::-1]
    'edcba7654321'

    Cần lưu ý rằng, kiểu xâu string là kiểu dữ liệu immutable không thay đổi được , tức là bạn không thể thay đổi được xâu đã tạo ra như một số ngôn ngữ khác, Pascal chẳng hạn, trừ khi bạn gán giá trị mới cho biến đã tạo đó. Để dễ hiểu, ta xét ví dụ xâu s = "Phu ong", chúng ta không thể thay đổi xâu s thành "phu ong" bằng phép gán s[0] = 'p' được. Lúc này, muốn thay đổi bắt buộc ta phải gán đè nội dung mới cho biến s, và đương nhiên một biến s mới sẽ được tạo ra tại một địa chỉ bộ nhớ mới. Để hiểu rõ hơn, xin mời xem ví dụ sau đây.

    >>> s = 'Phu Ong'
    >>> id(s)
    2281456950328
    >>> s[0]
    'P'
    >>> s[0] = 'p'
    Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
    TypeError: 'str' object does not support item assignment
    >>> s = 'phu ong'
    >>> id(s)
    2281456951056
    >>> s += ' is my name!'
    >>> s
    'phu ong is my name!'
    >>> id(s)
    2281456947112

    Đầu tiên khi khởi tạo biến s = 'Phu Ong' thì máy tính sẽ tham chiếu định danh (biến) s đến vùng ô nhớ có địa chỉ 2281456950328, lưu ý rằng ở máy tính của bạn địa chỉ này có thể khác. Và chúng ta không thể sửa đổi nội dung xâu trong biến s này, chẳng hạn ta thử sửa chữ P thành p bằng phép gán s[0] = 'p', máy báo lỗi ngay. Sau đó, ta bắt buộc phải thực hiện phép gán mới, nếu muốn biến s tham chiếu đến nội dung khác, đương nhiên sẽ được lưu ở vùng bộ nhớ có địa chỉ mới, lần này là 2281456951056. Thậm chí, khi ta thực hiện các phép toán trên xâu s, tổng quát là các hàm, các phương thức, mà làm cho dữ liệu của biến s thay đổi, thì thực ra là máy đã tham chiếu tên biến s đến một vùng ô nhớ mới. Điều này khác hoàn toàn với kiểu dữ liệu mutable thay đổi được, kiểu danh sách list chẳng hạn. Để tìm hiểu kĩ hơn về kiểu danh sách xin mời xem phần sau.

    >>> L = [1, 3, 8]
    >>> id(L)
    2281456980424
    >>> L.append(2)
    >>> L
    [1, 3, 8, 2]
    >>> id(L)
    2281456980424

    Sau khi thực hiện phương thức thêm vào danh sách L phần tử 2 thì địa chỉ ô nhớ của biến L vẫn như cũ, không hề thay đổi.

    Trong Python có hai kiểu dữ liệu là không thay đổi được immutable và thay đổi được mutable. Kiểu dữ liệu immutable gồm có kiểu số nguyên int, kiểu số thực floatdecimal, kiểu số phức complex, kiểu logic bool, kiểu xâu string, kiểu bộ tuple, kiểu khoảng range, kiểu tập hợp đóng băng frozenset, kiểu số nguyên bytes. Còn kiểu mutable gồm có danh sách list, từ điển dict, tập hợp set, mảng số nguyên bytearray, và các lớp do người dùng định nghĩa (trừ trường hợp chỉ rõ lớp đó là immutable). Chúng ta sẽ lần lượt xét tính thay đổi được hay không của từng kiểu dữ liệu khi học đến chúng.

    Ưu điểm lớn nhất của kiểu immutable là máy tính sẽ sử dụng bộ nhớ đúng để biểu diễn dữ liệu của biến đó, như vậy sẽ tiết kiệm bộ nhớ hơn là việc phải dành sẵn một dung lượng bộ nhớ lớn hơn dữ liệu hiện tại biến đó đang tham chiếu đến.

    Ngoài cách dùng câu lệnh <string>[i:j], bạn cũng có thể dùng hàm slice() để cắt lát một phần của chuỗi (hàm slice() này có thể áp dụng không chỉ cho chuỗi mà cho các đối tượng khác có đánh chỉ số). Cú pháp là slice(stop) hoặc slice(start, stop, step)

    4. Tách và gộp chuỗi trong Python

    Phương thức <string>.("<kí tự>") dùng để tách <string> thành các xâu con, mà mỗi xâu con này phân cách nhau bởi kí tự <kí tự>. Kết quả trả về được đặt trong một danh sách list, bạn có thể xem phần kiểu dữ liệu danh sách ở phần sau để hiểu rõ hơn về danh sách. Nếu phương thức split này không có tham số truyền vào, thì mặc định, Python sẽ sử dụng dấu cách trắng để làm kí tự tách.

    >>> s = "We all love Python"
    >>> s.split(" ")
    ['We', 'all', 'love', 'Python']
    >>> s.split()
    ['We', 'all', 'love', 'Python']

    Ở ví dụ trên, chúng ta tách xâu thành các xâu con, mà mỗi xâu con được cách nhau bởi dấu cách trắng. Còn ví dụ sau chúng ta quy định kí tự để tách là dấu chấm.

    >>> pi = "3.1415926"
    >>> pi.split('.')
    ['3', '1415926']

    Đôi khi, chúng ta cần tách từng kí tự của một xâu, khi đó ta phải sử dụng phương pháp chuyển đổi một xâu sang danh sách, sử dụng hàm list(). Chẳng hạn

    >>> s = "Phuong"
    >>> list(s)
    ['P', 'h', 'u', 'o', 'n', 'g']

    Vấn đề này xin tìm hiểu thêm ở phần kiểu dữ liệu danh sách list.

    Ngược lại của tách, chúng ta có thể nối nhiều xâu thành một xâu bằng cách dùng phương thức , sử dụng cú pháp sau

    <kí tự nối>.join(<danh_sách>)

    Phương thức này sẽ nối các phần tử của <danh_sách> lại với nhau thành một xâu mới, giữa các phần tử của <danh_sách> ở trong xâu mới sẽ được cách nhau bởi <kí tự nối>.

    >>> "-".join(["Toi","la","Phu","Ong"])
    'Toi-la-Phu-Ong'

    5. Các phương thức khác của string chuỗi trong Python

    Đối với string kiểu xâu (kiểu chuỗi) trong Python, chúng ta có một số phương thức – hàm hay sử dụng sau đây:

    • Hàm <string>.title() dùng để chuyển các kí tự đầu của mỗi từ trong <string> thành kiểu chữ hoa.
    >>> s = "i'm phu ong"
    >>> s.title()
    "I'm Phu Ong"
    • Hàm <string>.upper() dùng để chuyển tất cả các kí tự trong chuỗi <string> thành kiểu chữ hoa.
    >>> s = "i'm phu ong"
    >>> s.upper()
    "I'M PHU ONG"
    • Hàm <string>.capitalize() dùng để chuyển chữ cái đầu tiên của chuỗi <string> thành kiểu chữ in hoa.
    • Hàm <string>.lower() dùng để chuyển tất cả các kí tự trong <string> thành kiểu chữ thường.
    >>> s = "I'm Phu Ong"
    >>> s.lower()
    "i'm phu ong"
    • Hàm <string>.swapcase() dùng để hoán đổi kí tự hoa thành thường và thường thành hoa cuủa tất cả các kí tự trong <string>.
    >> s = "I'm Phu Ong"
    >>> s.swapcase()
    "i'M pHU oNG"
    • Hàm <string>.center(length, character) trả về một chuỗi mới có độ dài length sẽ chứa chuỗi <string> được căn giữa, sử dụng kí tự character(mặc định là khoảng trắng) như ký tự lấp đầy.
    >>> s='phuong'
    >>> s.center(30,'.')
    '............phuong............'
    >>> s.center(30)
    '            phuong            '
    >>> s.center(30,'~')
    '~~~~~~~~~~~~phuong~~~~~~~~~~~~'
    • Hàm <string>.isalnum() dùng để kiểm tra xem <string> có chỉ gồm các kí tự thuộc bảng chữ cái a-Z hoặc chữ số 0-9 hay không, tức là có không chứa các kí tự đặc biệt như !@#$%… hay không.
    >>> s = "qwerty123"
    >>> s.isalnum()
    True
    >>> s = "qwerty$%"
    >>> s.isalnum()
    False

    Chú ý rằng, kể cả xâu của chúng ta có chứa kí tự cách trắng thì kết quả trả về cũng là False.

    • Tương tự, hàm <string>.digit() dùng để kiểm tra xem <string> có phải chỉ chứa các kí tự số 0-9 hay không.
    >>> s="123"
    >>> s.isdigit()
    True
    >>> s="123.45"
    >>> s.isdigit()
    False
    • Hàm <string>.alpha() dùng để kiểm tra xem <string> có phải chỉ chứa các kí tự thuộc bảng chữ cái a-Z hay không, kết quả trả về là kiểu Boolean. Ở ví dụ sau nếu xâu có chứa dấu cách thì kết quả trả về là False.
    >>> s="Alphabet"
    >>> s.isalpha()
    True
    >>> s="Alphabet ABC"
    >>> s.isalpha()
    False
    • Hàm <string>.islower()<string>.isupper() dùng để kiểm tra xem <string> có phải chỉ chứa các kí tự chữ thường/chữ hoa hay không. Tương tự, chúng ta cũng có hàm <string>.istitle() để kiểm tra xem các từ trong <string> có được viết hoa chữ cái đầu mỗi từ hay không.
    >>> s = 'Toi La Phu Ong'
    >>> s.isupper()
    False
    >>> s.islower()
    False
    >>> s.istitle()
    True
    • Hàm len(<string>) trả về độ dài (số lượng kí tự) của <string>.
    • Phương thức <string>.trip() dùng để loại bỏ các khoảng trắng (dấu cách, dấu Tab, kí tự xuống dòng) ở đầu và cuối xâu. Tương tự, phương thức sẽ loại bỏ các khoảng trắng ở bên trái của xâu, tức ở đầu xâu, còn sẽ loại bỏ ở cuối xâu.
    >>> s = ' Toi la Phu Ong \n'
    >>> s.strip()
    'Toi la Phu Ong'
    >>> s.lstrip()
    'Toi la Phu Ong \n'
    >>> s.rstrip()
    ' Toi la Phu Ong'

    Như ta thấy, kết quả trả về không ảnh hưởng gì tới biến s cả, vì biến s có kiểu xâu là kiểu dữ liệu immutable, nên các hàm, phương thức không thể làm thay đổi được dữ liệu lưu trong biến s.

    • Hàm <string>.(<string con>) dùng để tìm kiếm ký tự hoặc xâu <string con> trong <string>. Kết quả trả về là vị trí đầu tiên xuất hiện <string con> trong <string>, nếu không tìm thấy thì kết quả là -1.
    >>> s = 'Toi la Phu Ong'
    >>> s.find('Phu')
    7
    >>> s.find('PhuOng')
    -1
    • Trong các phương thức tìm kiếm, còn có hai phương thức là <string>.startswith(<string con>)<string>.endswith(<string con>) dùng để kiểm tra xem xâu <string> có bắt đầu hoặc kết thúc bởi <string con> hay không, đương nhiên kết quả trả về là kiểu bool.
    >>> s = 'Toi la Phu Ong'
    >>> s.startswith('Toi')
    True
    >>> s.endswith('g')
    True

    Ngoài ra những phương thức-hàm kể trên, kiểu chuỗi trong Python còn một số phương thức khác, mời bạn xem tại đây.