{"id":27523,"date":"2025-04-25T14:01:09","date_gmt":"2025-04-25T07:01:09","guid":{"rendered":"https:\/\/interdata.vn\/blog\/?p=27523"},"modified":"2025-04-25T14:01:09","modified_gmt":"2025-04-25T07:01:09","slug":"de-quy-la-gi","status":"publish","type":"post","link":"https:\/\/interdata.vn\/blog\/de-quy-la-gi\/","title":{"rendered":"\u0110\u1ec7 quy l\u00e0 g\u00ec? Gi\u1ea3i th\u00edch A-Z, V\u00ed d\u1ee5 &#038; So s\u00e1nh V\u00f2ng l\u1eb7p"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter ez-toc-white ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">N\u1ed8I DUNG<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 eztoc-toggle-hide-by-default' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/interdata.vn\/blog\/de-quy-la-gi\/#De-quy-Recursion-la-gi\" >\u0110\u1ec7 quy (Recursion) l\u00e0 g\u00ec?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/interdata.vn\/blog\/de-quy-la-gi\/#Co-che-hoat-dong-chi-tiet-cua-Ham-de-quy\" >C\u01a1 ch\u1ebf ho\u1ea1t \u0111\u1ed9ng chi ti\u1ebft c\u1ee7a H\u00e0m \u0111\u1ec7 quy<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/interdata.vn\/blog\/de-quy-la-gi\/#Truong-hop-co-so-Base-Case-Diem-dung-chan-an-toan\" >Tr\u01b0\u1eddng h\u1ee3p c\u01a1 s\u1edf (Base Case): \u0110i\u1ec3m d\u1eebng ch\u00e2n an to\u00e0n<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/interdata.vn\/blog\/de-quy-la-gi\/#Buoc-de-quy-Recursive-Step-Hanh-trinh-chia-nho-van-de\" >B\u01b0\u1edbc \u0111\u1ec7 quy (Recursive Step): H\u00e0nh tr\u00ecnh chia nh\u1ecf v\u1ea5n \u0111\u1ec1<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/interdata.vn\/blog\/de-quy-la-gi\/#Vi-du-ve-De-quy-trong-Lap-trinh-Code-de-hieu\" >V\u00ed d\u1ee5 v\u1ec1 \u0110\u1ec7 quy trong L\u1eadp tr\u00ecnh (Code d\u1ec5 hi\u1ec3u)<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/interdata.vn\/blog\/de-quy-la-gi\/#Vi-du-1-Tinh-Giai-thua-Factorial\" >V\u00ed d\u1ee5 1: T\u00ednh Giai th\u1eeba (Factorial)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/interdata.vn\/blog\/de-quy-la-gi\/#Vi-du-2-Tinh-so-Fibonacci-thu-n\" >V\u00ed d\u1ee5 2: T\u00ednh s\u1ed1 Fibonacci th\u1ee9 n<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/interdata.vn\/blog\/de-quy-la-gi\/#Vi-du-3-De-quy-trong-bai-toan-Thap-Ha-Noi-Tower-of-Hanoi\" >V\u00ed d\u1ee5 3: \u0110\u1ec7 quy trong b\u00e0i to\u00e1n Th\u00e1p H\u00e0 N\u1ed9i (Tower of Hanoi)<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/interdata.vn\/blog\/de-quy-la-gi\/#De-quy-va-Ngan-xep-loi-goi-ham-Call-Stack\" >\u0110\u1ec7 quy v\u00e0 Ng\u0103n x\u1ebfp l\u1eddi g\u1ecdi h\u00e0m (Call Stack)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/interdata.vn\/blog\/de-quy-la-gi\/#So-sanh-De-quy-Recursion-va-Vong-lap-Iteration\" >So s\u00e1nh \u0110\u1ec7 quy (Recursion) v\u00e0 V\u00f2ng l\u1eb7p (Iteration)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/interdata.vn\/blog\/de-quy-la-gi\/#Uu-diem-va-nhuoc-diem-cua-viec-su-dung-De-quy\" >\u01afu \u0111i\u1ec3m v\u00e0 nh\u01b0\u1ee3c \u0111i\u1ec3m c\u1ee7a vi\u1ec7c s\u1eed d\u1ee5ng \u0110\u1ec7 quy<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/interdata.vn\/blog\/de-quy-la-gi\/#Khi-nao-nen-va-khong-nen-dung-De-quy\" >Khi n\u00e0o n\u00ean v\u00e0 kh\u00f4ng n\u00ean d\u00f9ng \u0110\u1ec7 quy?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/interdata.vn\/blog\/de-quy-la-gi\/#Cau-hoi-thuong-gap-ve-De-quy-FAQ\" >C\u00e2u h\u1ecfi th\u01b0\u1eddng g\u1eb7p v\u1ec1 \u0110\u1ec7 quy (FAQ)<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/interdata.vn\/blog\/de-quy-la-gi\/#De-quy-co-kho-hoc-khong\" >\u0110\u1ec7 quy c\u00f3 kh\u00f3 h\u1ecdc kh\u00f4ng?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/interdata.vn\/blog\/de-quy-la-gi\/#Lam-the-nao-de-tranh-loi-Stack-Overflow\" >L\u00e0m th\u1ebf n\u00e0o \u0111\u1ec3 tr\u00e1nh l\u1ed7i Stack Overflow?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/interdata.vn\/blog\/de-quy-la-gi\/#De-quy-duoi-Tail-Recursion-la-gi\" >\u0110\u1ec7 quy \u0111u\u00f4i (Tail Recursion) l\u00e0 g\u00ec?<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n\n<p>Trong <a href=\"https:\/\/interdata.vn\/blog\/lap-trinh-la-gi\/\">l\u1eadp tr\u00ecnh<\/a>, ch\u00fang ta th\u01b0\u1eddng xuy\u00ean \u0111\u1ed1i m\u1eb7t v\u1edbi nh\u1eefng b\u00e0i to\u00e1n ph\u1ee9c t\u1ea1p. \u0110\u1ec3 gi\u1ea3i quy\u1ebft ch\u00fang, c\u00e1c l\u1eadp tr\u00ecnh vi\u00ean \u0111\u00e3 ph\u00e1t tri\u1ec3n nhi\u1ec1u k\u1ef9 thu\u1eadt v\u00e0 ph\u01b0\u01a1ng ph\u00e1p kh\u00e1c nhau. M\u1ed9t trong nh\u1eefng kh\u00e1i ni\u1ec7m n\u1ec1n t\u1ea3ng v\u00e0 m\u1ea1nh m\u1ebd, nh\u01b0ng \u0111\u00f4i khi c\u0169ng kh\u00e1 &#8220;hack n\u00e3o&#8221; cho ng\u01b0\u1eddi m\u1edbi, ch\u00ednh l\u00e0 <strong>\u0111\u1ec7 quy (Recursion)<\/strong>.<\/p>\n<p>B\u00e0i vi\u1ebft n\u00e0y s\u1ebd l\u00e0 kim ch\u1ec9 nam gi\u00fap b\u1ea1n hi\u1ec3u r\u00f5 <strong>\u0111\u1ec7 quy l\u00e0 g\u00ec<\/strong>, t\u1eeb \u0111\u1ecbnh ngh\u0129a c\u01a1 b\u1ea3n, c\u01a1 ch\u1ebf ho\u1ea1t \u0111\u1ed9ng, c\u00e1c v\u00ed d\u1ee5 minh h\u1ecda d\u1ec5 hi\u1ec3u b\u1eb1ng code, cho \u0111\u1ebfn vi\u1ec7c so s\u00e1nh v\u1edbi <a href=\"https:\/\/interdata.vn\/blog\/vong-lap-la-gi\/\">v\u00f2ng l\u1eb7p<\/a> quen thu\u1ed9c, ph\u00e2n t\u00edch \u01b0u nh\u01b0\u1ee3c \u0111i\u1ec3m v\u00e0 \u0111\u01b0a ra l\u1eddi khuy\u00ean khi n\u00e0o n\u00ean s\u1eed d\u1ee5ng k\u1ef9 thu\u1eadt n\u00e0y. H\u00e3y c\u00f9ng kh\u00e1m ph\u00e1 nh\u00e9!<\/p>\n<h2><span class=\"ez-toc-section\" id=\"De-quy-Recursion-la-gi\"><\/span>\u0110\u1ec7 quy (Recursion) l\u00e0 g\u00ec?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><a href=\"https:\/\/interdata.vn\/blog\/de-quy-la-gi\/\"><strong>\u0110\u1ec7 quy (Recursion)<\/strong><\/a> l\u00e0 m\u1ed9t k\u1ef9 thu\u1eadt l\u1eadp tr\u00ecnh c\u01a1 b\u1ea3n, trong \u0111\u00f3 m\u1ed9t <strong>h\u00e0m (function)<\/strong> t\u1ef1 g\u1ecdi l\u1ea1i ch\u00ednh n\u00f3 \u0111\u1ec3 gi\u1ea3i quy\u1ebft v\u1ea5n \u0111\u1ec1. K\u1ef9 thu\u1eadt n\u00e0y hi\u1ec7u qu\u1ea3 khi chia m\u1ed9t b\u00e0i to\u00e1n l\u1edbn th\u00e0nh c\u00e1c b\u00e0i to\u00e1n con nh\u1ecf h\u01a1n, gi\u1ed1ng h\u1ec7t b\u00e0i to\u00e1n g\u1ed1c nh\u01b0ng v\u1edbi ph\u1ea1m vi ho\u1eb7c d\u1eef li\u1ec7u \u0111\u1ea7u v\u00e0o \u0111\u01a1n gi\u1ea3n h\u01a1n.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2025\/04\/De-quy-Recursion.jpg\" alt=\"\u0110\u1ec7 quy (Recursion)\" width=\"750\" height=\"500\" class=\"aligncenter size-full wp-image-27526\" title=\"\" srcset=\"https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2025\/04\/De-quy-Recursion.jpg 750w, https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2025\/04\/De-quy-Recursion-300x200.jpg 300w\" sizes=\"auto, (max-width: 750px) 100vw, 750px\" \/><\/p>\n<p>\u0110i\u1ec3m c\u1ed1t l\u00f5i c\u1ee7a \u0111\u1ec7 quy l\u00e0 vi\u1ec7c h\u00e0m t\u1ef1 th\u1ef1c hi\u1ec7n l\u1ea1i ch\u00ednh n\u00f3. M\u1ed7i l\u1ea7n g\u1ecdi l\u1ea1i n\u00e0y s\u1ebd x\u1eed l\u00fd m\u1ed9t ph\u1ea7n nh\u1ecf c\u1ee7a b\u00e0i to\u00e1n t\u1ed5ng th\u1ec3. Qu\u00e1 tr\u00ecnh n\u00e0y ti\u1ebfp di\u1ec5n cho \u0111\u1ebfn khi \u0111\u1ea1t \u0111\u01b0\u1ee3c m\u1ed9t <strong>\u0111i\u1ec1u ki\u1ec7n d\u1eebng<\/strong> c\u1ee5 th\u1ec3, gi\u00fap h\u00e0m kh\u00f4ng g\u1ecdi l\u1ea1i ch\u00ednh n\u00f3 v\u00f4 h\u1ea1n, tr\u00e1nh g\u00e2y l\u1ed7i ch\u01b0\u01a1ng tr\u00ecnh.<\/p>\n<p>B\u1ea1n c\u00f3 th\u1ec3 h\u00ecnh dung \u0111\u1ec7 quy gi\u1ed1ng nh\u01b0 nh\u1eefng con b\u00fap b\u00ea Nga Matryoshka l\u1ed3ng v\u00e0o nhau. \u0110\u1ec3 m\u1edf con b\u00fap b\u00ea l\u1edbn nh\u1ea5t, b\u1ea1n c\u1ea7n m\u1edf l\u1ea7n l\u01b0\u1ee3t c\u00e1c con nh\u1ecf h\u01a1n b\u00ean trong. M\u1ed7i h\u00e0nh \u0111\u1ed9ng m\u1edf m\u1ed9t con b\u00fap b\u00ea t\u01b0\u01a1ng t\u1ef1 nh\u01b0 m\u1ed9t b\u01b0\u1edbc g\u1ecdi \u0111\u1ec7 quy, gi\u1ea3i quy\u1ebft phi\u00ean b\u1ea3n nh\u1ecf h\u01a1n c\u1ee7a &#8220;b\u00e0i to\u00e1n m\u1edf b\u00fap b\u00ea&#8221;.<\/p>\n<p>M\u1ecdi h\u00e0m \u0111\u1ec7 quy ho\u1ea1t \u0111\u1ed9ng \u0111\u00fang c\u1ea7n c\u00f3 hai th\u00e0nh ph\u1ea7n thi\u1ebft y\u1ebfu. M\u1ed9t l\u00e0 <strong>Tr\u01b0\u1eddng h\u1ee3p c\u01a1 s\u1edf (Base Case)<\/strong>: \u0111\u00e2y l\u00e0 \u0111i\u1ec1u ki\u1ec7n c\u1ee5 th\u1ec3 m\u00e0 t\u1ea1i \u0111\u00f3 h\u00e0m s\u1ebd ng\u1eebng g\u1ecdi l\u1ea1i ch\u00ednh n\u00f3 v\u00e0 tr\u1ea3 v\u1ec1 m\u1ed9t gi\u00e1 tr\u1ecb. Hai l\u00e0 <strong>B\u01b0\u1edbc \u0111\u1ec7 quy (Recursive Step)<\/strong>: n\u01a1i h\u00e0m g\u1ecdi l\u1ea1i ch\u00ednh n\u00f3 v\u1edbi d\u1eef li\u1ec7u \u0111\u00e3 \u0111\u01b0\u1ee3c thay \u0111\u1ed5i \u0111\u1ec3 ti\u1ebfn g\u1ea7n h\u01a1n t\u1edbi Tr\u01b0\u1eddng h\u1ee3p c\u01a1 s\u1edf.<\/p>\n<p>\u0110\u1ec7 quy cung c\u1ea5p m\u1ed9t c\u00e1ch ti\u1ebfp c\u1eadn kh\u00e1c so v\u1edbi vi\u1ec7c s\u1eed d\u1ee5ng <strong>v\u00f2ng l\u1eb7p (iteration)<\/strong>, v\u00ed d\u1ee5 nh\u01b0 v\u00f2ng l\u1eb7p <code>for<\/code> ho\u1eb7c <code>while<\/code>, \u0111\u1ec3 th\u1ef1c hi\u1ec7n c\u00e1c c\u00f4ng vi\u1ec7c l\u1eb7p \u0111i l\u1eb7p l\u1ea1i. L\u1ef1a ch\u1ecdn gi\u1eefa ch\u00fang th\u01b0\u1eddng ph\u1ee5 thu\u1ed9c v\u00e0o b\u00e0i to\u00e1n c\u1ee5 th\u1ec3, s\u1ef1 r\u00f5 r\u00e0ng c\u1ee7a m\u00e3 ngu\u1ed3n v\u00e0 \u0111\u00f4i khi l\u00e0 hi\u1ec7u su\u1ea5t mong mu\u1ed1n.<\/p>\n<p>K\u1ef9 thu\u1eadt \u0111\u1ec7 quy t\u1ecf ra \u0111\u1eb7c bi\u1ec7t m\u1ea1nh m\u1ebd v\u00e0 t\u1ef1 nhi\u00ean \u0111\u1ed1i v\u1edbi c\u00e1c b\u00e0i to\u00e1n c\u00f3 b\u1ea3n ch\u1ea5t \u0111\u1ec7 quy. V\u00ed d\u1ee5 \u0111i\u1ec3n h\u00ecnh bao g\u1ed3m vi\u1ec7c t\u00ednh <strong>giai th\u1eeba<\/strong>, x\u1eed l\u00fd <strong>d\u00e3y Fibonacci<\/strong>, duy\u1ec7t c\u00e1c <strong>c\u1ea5u tr\u00fac d\u1eef li\u1ec7u (data structures)<\/strong> d\u1ea1ng c\u00e2y, ho\u1eb7c tri\u1ec3n khai c\u00e1c <strong>gi\u1ea3i thu\u1eadt (algorithms)<\/strong> theo ph\u01b0\u01a1ng ph\u00e1p <strong>chia \u0111\u1ec3 tr\u1ecb (divide and conquer)<\/strong>.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Co-che-hoat-dong-chi-tiet-cua-Ham-de-quy\"><\/span>C\u01a1 ch\u1ebf ho\u1ea1t \u0111\u1ed9ng chi ti\u1ebft c\u1ee7a H\u00e0m \u0111\u1ec7 quy<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0110\u1ec3 hi\u1ec3u r\u00f5 <strong>h\u00e0m \u0111\u1ec7 quy<\/strong> ho\u1ea1t \u0111\u1ed9ng th\u1ebf n\u00e0o, ch\u00fang ta c\u1ea7n xem x\u00e9t k\u1ef9 hai th\u00e0nh ph\u1ea7n c\u1ed1t l\u00f5i \u0111\u00e3 \u0111\u1ec1 c\u1eadp: <strong>Tr\u01b0\u1eddng h\u1ee3p c\u01a1 s\u1edf (Base Case)<\/strong> v\u00e0 <strong>B\u01b0\u1edbc \u0111\u1ec7 quy (Recursive Step)<\/strong>. S\u1ef1 ph\u1ed1i h\u1ee3p nh\u1ecbp nh\u00e0ng gi\u1eefa hai y\u1ebfu t\u1ed1 n\u00e0y ch\u00ednh l\u00e0 ch\u00eca kh\u00f3a cho m\u1ed9t gi\u1ea3i thu\u1eadt \u0111\u1ec7 quy ch\u00ednh x\u00e1c v\u00e0 hi\u1ec7u qu\u1ea3.<\/p>\n<p>Vi\u1ec7c thi\u1ebfu m\u1ed9t trong hai th\u00e0nh ph\u1ea7n, ho\u1eb7c \u0111\u1ecbnh ngh\u0129a ch\u00fang kh\u00f4ng ch\u00ednh x\u00e1c, s\u1ebd d\u1eabn \u0111\u1ebfn l\u1ed7i. N\u1ebfu thi\u1ebfu Base Case, h\u00e0m s\u1ebd g\u1ecdi l\u1ea1i ch\u00ednh n\u00f3 m\u00e3i m\u00e3i (ho\u1eb7c cho \u0111\u1ebfn khi b\u1ed9 nh\u1edb c\u1ea1n ki\u1ec7t). N\u1ebfu Recursive Step kh\u00f4ng h\u01b0\u1edbng \u0111\u1ebfn Base Case, h\u00e0m c\u0169ng s\u1ebd kh\u00f4ng bao gi\u1edd d\u1eebng l\u1ea1i \u0111\u00fang c\u00e1ch.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Truong-hop-co-so-Base-Case-Diem-dung-chan-an-toan\"><\/span>Tr\u01b0\u1eddng h\u1ee3p c\u01a1 s\u1edf (Base Case): \u0110i\u1ec3m d\u1eebng ch\u00e2n an to\u00e0n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><strong>Tr\u01b0\u1eddng h\u1ee3p c\u01a1 s\u1edf (Base Case)<\/strong> l\u00e0 \u0111i\u1ec1u ki\u1ec7n c\u1ee5 th\u1ec3 trong h\u00e0m \u0111\u1ec7 quy m\u00e0 t\u1ea1i \u0111\u00f3, h\u00e0m s\u1ebd kh\u00f4ng th\u1ef1c hi\u1ec7n l\u1eddi g\u1ecdi \u0111\u1ec7 quy n\u00e0o n\u1eefa, thay v\u00e0o \u0111\u00f3 n\u00f3 tr\u1ea3 v\u1ec1 m\u1ed9t gi\u00e1 tr\u1ecb k\u1ebft qu\u1ea3 tr\u1ef1c ti\u1ebfp. \u0110\u00e2y ch\u00ednh l\u00e0 \u0111i\u1ec3m d\u1eebng, l\u00e0 l\u1ed1i tho\u00e1t c\u1ee7a qu\u00e1 tr\u00ecnh \u0111\u1ec7 quy, \u0111\u1ea3m b\u1ea3o h\u00e0m k\u1ebft th\u00fac.<\/p>\n<p>S\u1ef1 t\u1ed3n t\u1ea1i c\u1ee7a Base Case l\u00e0 b\u1eaft bu\u1ed9c. N\u1ebfu kh\u00f4ng c\u00f3 n\u00f3, h\u00e0m s\u1ebd li\u00ean t\u1ee5c g\u1ecdi l\u1ea1i ch\u00ednh m\u00ecnh, t\u1ea1o ra m\u1ed9t chu\u1ed7i l\u1eddi g\u1ecdi v\u00f4 h\u1ea1n. \u0110i\u1ec1u n\u00e0y nhanh ch\u00f3ng l\u00e0m c\u1ea1n ki\u1ec7t b\u1ed9 nh\u1edb d\u00e0nh cho vi\u1ec7c qu\u1ea3n l\u00fd c\u00e1c l\u1eddi g\u1ecdi h\u00e0m, d\u1eabn \u0111\u1ebfn l\u1ed7i <strong><a href=\"https:\/\/interdata.vn\/blog\/stack-la-gi\/\">Stack<\/a> Overflow<\/strong> (s\u1ebd gi\u1ea3i th\u00edch k\u1ef9 h\u01a1n \u1edf ph\u1ea7n sau).<\/p>\n<p>Th\u01b0\u1eddng th\u00ec, Base Case t\u01b0\u01a1ng \u1ee9ng v\u1edbi tr\u01b0\u1eddng h\u1ee3p \u0111\u01a1n gi\u1ea3n nh\u1ea5t c\u1ee7a b\u00e0i to\u00e1n, n\u01a1i m\u00e0 k\u1ebft qu\u1ea3 c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c x\u00e1c \u0111\u1ecbnh ngay l\u1eadp t\u1ee9c m\u00e0 kh\u00f4ng c\u1ea7n th\u00eam b\u01b0\u1edbc \u0111\u1ec7 quy n\u00e0o. V\u00ed d\u1ee5, trong b\u00e0i to\u00e1n t\u00ednh giai th\u1eeba <code>n!<\/code>, Base Case l\u00e0 <code>0! = 1<\/code>. V\u1edbi d\u00e3y Fibonacci, Base Cases l\u00e0 <code>Fib(0) = 0<\/code> v\u00e0 <code>Fib(1) = 1<\/code>.<\/p>\n<p>Khi thi\u1ebft k\u1ebf m\u1ed9t h\u00e0m \u0111\u1ec7 quy, vi\u1ec7c \u0111\u1ea7u ti\u00ean v\u00e0 quan tr\u1ecdng nh\u1ea5t l\u00e0 x\u00e1c \u0111\u1ecbnh (c\u00e1c) tr\u01b0\u1eddng h\u1ee3p c\u01a1 s\u1edf. H\u00e3y t\u1ef1 h\u1ecfi: &#8220;Phi\u00ean b\u1ea3n \u0111\u01a1n gi\u1ea3n nh\u1ea5t c\u1ee7a b\u00e0i to\u00e1n n\u00e0y l\u00e0 g\u00ec m\u00e0 t\u00f4i c\u00f3 th\u1ec3 tr\u1ea3 l\u1eddi ngay l\u1eadp t\u1ee9c?&#8221;. C\u00e2u tr\u1ea3 l\u1eddi s\u1ebd gi\u00fap b\u1ea1n \u0111\u1ecbnh ngh\u0129a Base Case m\u1ed9t c\u00e1ch ch\u00ednh x\u00e1c.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Buoc-de-quy-Recursive-Step-Hanh-trinh-chia-nho-van-de\"><\/span>B\u01b0\u1edbc \u0111\u1ec7 quy (Recursive Step): H\u00e0nh tr\u00ecnh chia nh\u1ecf v\u1ea5n \u0111\u1ec1<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><strong>B\u01b0\u1edbc \u0111\u1ec7 quy (Recursive Step)<\/strong> l\u00e0 ph\u1ea7n c\u1ee7a h\u00e0m n\u01a1i n\u00f3 th\u1ef1c hi\u1ec7n l\u1eddi g\u1ecdi l\u1ea1i ch\u00ednh m\u00ecnh, nh\u01b0ng v\u1edbi m\u1ed9t phi\u00ean b\u1ea3n nh\u1ecf h\u01a1n ho\u1eb7c \u0111\u01a1n gi\u1ea3n h\u01a1n c\u1ee7a b\u00e0i to\u00e1n ban \u0111\u1ea7u. M\u1ee5c ti\u00eau l\u00e0 \u0111\u1ec3 d\u1eef li\u1ec7u \u0111\u1ea7u v\u00e0o ti\u1ebfn d\u1ea7n \u0111\u1ebfn <strong>Tr\u01b0\u1eddng h\u1ee3p c\u01a1 s\u1edf (Base Case)<\/strong> sau m\u1ed7i l\u1ea7n g\u1ecdi.<\/p>\n<p>Trong b\u01b0\u1edbc n\u00e0y, h\u00e0m th\u01b0\u1eddng th\u1ef1c hi\u1ec7n m\u1ed9t s\u1ed1 ph\u00e9p t\u00ednh ho\u1eb7c <a href=\"https:\/\/interdata.vn\/blog\/data-preprocessing-la-gi\/\">x\u1eed l\u00fd d\u1eef li\u1ec7u<\/a>, sau \u0111\u00f3 k\u1ebft h\u1ee3p k\u1ebft qu\u1ea3 \u0111\u00f3 v\u1edbi k\u1ebft qu\u1ea3 tr\u1ea3 v\u1ec1 t\u1eeb l\u1eddi g\u1ecdi \u0111\u1ec7 quy ti\u1ebfp theo. L\u1eddi g\u1ecdi \u0111\u1ec7 quy n\u00e0y s\u1eed d\u1ee5ng c\u00e1c <a href=\"https:\/\/interdata.vn\/blog\/tham-so-parameter-la-gi\/\">tham s\u1ed1<\/a> \u0111\u00e3 \u0111\u01b0\u1ee3c \u0111i\u1ec1u ch\u1ec9nh (v\u00ed d\u1ee5: <code>n-1<\/code> thay v\u00ec <code>n<\/code>) \u0111\u1ec3 \u0111\u1ea3m b\u1ea3o b\u00e0i to\u00e1n \u0111ang \u0111\u01b0\u1ee3c &#8220;thu nh\u1ecf&#8221; l\u1ea1i.<\/p>\n<p>\u0110i\u1ec1u c\u1ef1c k\u1ef3 quan tr\u1ecdng l\u00e0 m\u1ed7i b\u01b0\u1edbc \u0111\u1ec7 quy ph\u1ea3i \u0111\u1ea3m b\u1ea3o r\u1eb1ng n\u00f3 \u0111ang di chuy\u1ec3n &#8220;g\u1ea7n h\u01a1n&#8221; \u0111\u1ebfn Base Case. N\u1ebfu b\u01b0\u1edbc \u0111\u1ec7 quy kh\u00f4ng l\u00e0m thay \u0111\u1ed5i \u0111\u1ea7u v\u00e0o theo h\u01b0\u1edbng ti\u1ebfn \u0111\u1ebfn Base Case, h\u00e0m s\u1ebd kh\u00f4ng bao gi\u1edd \u0111\u1ea1t \u0111\u01b0\u1ee3c \u0111i\u1ec3m d\u1eebng v\u00e0 g\u00e2y ra v\u00f2ng l\u1eb7p v\u00f4 h\u1ea1n (t\u01b0\u01a1ng t\u1ef1 nh\u01b0 thi\u1ebfu Base Case).<\/p>\n<p>B\u01b0\u1edbc \u0111\u1ec7 quy ch\u00ednh l\u00e0 n\u01a1i th\u1ec3 hi\u1ec7n r\u00f5 t\u01b0 duy <strong>chia \u0111\u1ec3 tr\u1ecb (divide and conquer)<\/strong>. Thay v\u00ec gi\u1ea3i quy\u1ebft tr\u1ef1c ti\u1ebfp b\u00e0i to\u00e1n l\u1edbn, ch\u00fang ta chia n\u00f3 th\u00e0nh m\u1ed9t ho\u1eb7c nhi\u1ec1u b\u00e0i to\u00e1n con gi\u1ed1ng h\u1ec7t nh\u01b0ng nh\u1ecf h\u01a1n, gi\u1ea3i quy\u1ebft c\u00e1c b\u00e0i to\u00e1n con \u0111\u00f3 b\u1eb1ng c\u00e1ch g\u1ecdi \u0111\u1ec7 quy, v\u00e0 cu\u1ed1i c\u00f9ng k\u1ebft h\u1ee3p k\u1ebft qu\u1ea3 l\u1ea1i.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2025\/04\/De-quy-Recursion-01.jpg\" alt=\"\u0110\u1ec7 quy (Recursion) 01\" width=\"750\" height=\"412\" class=\"aligncenter size-full wp-image-27524\" title=\"\" srcset=\"https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2025\/04\/De-quy-Recursion-01.jpg 750w, https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2025\/04\/De-quy-Recursion-01-300x165.jpg 300w\" sizes=\"auto, (max-width: 750px) 100vw, 750px\" \/><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Vi-du-ve-De-quy-trong-Lap-trinh-Code-de-hieu\"><\/span>V\u00ed d\u1ee5 v\u1ec1 \u0110\u1ec7 quy trong L\u1eadp tr\u00ecnh (Code d\u1ec5 hi\u1ec3u)<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>L\u00fd thuy\u1ebft s\u1ebd d\u1ec5 h\u00ecnh dung h\u01a1n r\u1ea5t nhi\u1ec1u qua c\u00e1c v\u00ed d\u1ee5 th\u1ef1c t\u1ebf. Ch\u00fang ta s\u1ebd c\u00f9ng xem x\u00e9t m\u1ed9t s\u1ed1 b\u00e0i to\u00e1n kinh \u0111i\u1ec3n th\u01b0\u1eddng \u0111\u01b0\u1ee3c gi\u1ea3i b\u1eb1ng \u0111\u1ec7 quy, v\u1edbi code minh h\u1ecda b\u1eb1ng Python v\u00e0 JavaScript &#8211; hai ng\u00f4n ng\u1eef ph\u1ed5 bi\u1ebfn v\u00e0 c\u00f3 c\u00fa ph\u00e1p t\u01b0\u01a1ng \u0111\u1ed1i d\u1ec5 \u0111\u1ecdc cho ng\u01b0\u1eddi m\u1edbi b\u1eaft \u0111\u1ea7u.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Vi-du-1-Tinh-Giai-thua-Factorial\"><\/span>V\u00ed d\u1ee5 1: T\u00ednh Giai th\u1eeba (Factorial)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>B\u00e0i to\u00e1n t\u00ednh giai th\u1eeba c\u1ee7a m\u1ed9t <a href=\"https:\/\/interdata.vn\/blog\/so-nguyen-integer\/\">s\u1ed1 nguy\u00ean<\/a> kh\u00f4ng \u00e2m <code>n<\/code>, k\u00fd hi\u1ec7u l\u00e0 <code>n!<\/code>, l\u00e0 m\u1ed9t v\u00ed d\u1ee5 nh\u1eadp m\u00f4n kinh \u0111i\u1ec3n cho \u0111\u1ec7 quy. Giai th\u1eeba \u0111\u01b0\u1ee3c \u0111\u1ecbnh ngh\u0129a l\u00e0 t\u00edch c\u1ee7a t\u1ea5t c\u1ea3 c\u00e1c s\u1ed1 nguy\u00ean d\u01b0\u01a1ng t\u1eeb 1 \u0111\u1ebfn <code>n<\/code>.<\/p>\n<ul>\n<li><strong>C\u00f4ng th\u1ee9c:<\/strong> <code>n! = n * (n-1) * (n-2) * ... * 1<\/code><\/li>\n<li><strong>Tr\u01b0\u1eddng h\u1ee3p c\u01a1 s\u1edf (Base Case):<\/strong> <code>0! = 1<\/code><\/li>\n<li><strong>B\u01b0\u1edbc \u0111\u1ec7 quy (Recursive Step):<\/strong> <code>n! = n * (n-1)!<\/code> (v\u1edbi n &gt; 0)<\/li>\n<\/ul>\n<p>Python<\/p>\n<pre><code class=\"language-plaintext\"># Code Python t\u00ednh giai th\u1eeba b\u1eb1ng \u0111\u1ec7 quy\r\ndef factorial_recursive(n):\r\n  # Tr\u01b0\u1eddng h\u1ee3p c\u01a1 s\u1edf\r\n  if n == 0:\r\n    return 1\r\n  # B\u01b0\u1edbc \u0111\u1ec7 quy\r\n  else:\r\n    return n * factorial_recursive(n - 1)\r\n\r\n# V\u00ed d\u1ee5 s\u1eed d\u1ee5ng\r\nprint(f\"3! = {factorial_recursive(3)}\") # Output: 3! = 6\r\nprint(f\"5! = {factorial_recursive(5)}\") # Output: 5! = 120\r\n<\/code><\/pre>\n<p>JavaScript<\/p>\n<pre><code class=\"language-plaintext\">\/\/ Code JavaScript t\u00ednh giai th\u1eeba b\u1eb1ng \u0111\u1ec7 quy\r\nfunction factorialRecursive(n) {\r\n  \/\/ Tr\u01b0\u1eddng h\u1ee3p c\u01a1 s\u1edf\r\n  if (n === 0) {\r\n    return 1;\r\n  }\r\n  \/\/ B\u01b0\u1edbc \u0111\u1ec7 quy\r\n  else {\r\n    return n * factorialRecursive(n - 1);\r\n  }\r\n}\r\n\r\n\/\/ V\u00ed d\u1ee5 s\u1eed d\u1ee5ng\r\nconsole.log(`3! = ${factorialRecursive(3)}`); \/\/ Output: 3! = 6\r\nconsole.log(`5! = ${factorialRecursive(5)}`); \/\/ Output: 5! = 120\r\n<\/code><\/pre>\n<p>Trong \u0111o\u1ea1n code tr\u00ean, h\u00e0m <code>factorial_recursive<\/code> ki\u1ec3m tra n\u1ebfu <code>n<\/code> b\u1eb1ng 0 (Base Case), n\u00f3 tr\u1ea3 v\u1ec1 1. N\u1ebfu kh\u00f4ng, n\u00f3 tr\u1ea3 v\u1ec1 <code>n<\/code> nh\u00e2n v\u1edbi k\u1ebft qu\u1ea3 c\u1ee7a vi\u1ec7c g\u1ecdi l\u1ea1i ch\u00ednh n\u00f3 v\u1edbi <code>n-1<\/code> (Recursive Step), \u0111\u01b0a b\u00e0i to\u00e1n ti\u1ebfn g\u1ea7n h\u01a1n \u0111\u1ebfn Base Case <code>n=0<\/code>.<\/p>\n<p>H\u00e3y xem c\u00e1ch n\u00f3 ho\u1ea1t \u0111\u1ed9ng v\u1edbi <code>n=3<\/code>:<\/p>\n<ol>\n<li><code>factorial_recursive(3)<\/code> g\u1ecdi <code>factorial_recursive(2)<\/code>. N\u00f3 ch\u1edd k\u1ebft qu\u1ea3 v\u00e0 s\u1ebd nh\u00e2n v\u1edbi 3.<\/li>\n<li><code>factorial_recursive(2)<\/code> g\u1ecdi <code>factorial_recursive(1)<\/code>. N\u00f3 ch\u1edd k\u1ebft qu\u1ea3 v\u00e0 s\u1ebd nh\u00e2n v\u1edbi 2.<\/li>\n<li><code>factorial_recursive(1)<\/code> g\u1ecdi <code>factorial_recursive(0)<\/code>. N\u00f3 ch\u1edd k\u1ebft qu\u1ea3 v\u00e0 s\u1ebd nh\u00e2n v\u1edbi 1.<\/li>\n<li><code>factorial_recursive(0)<\/code> g\u1eb7p Base Case, tr\u1ea3 v\u1ec1 1.<\/li>\n<li><code>factorial_recursive(1)<\/code> nh\u1eadn \u0111\u01b0\u1ee3c 1, t\u00ednh 1 * 1 = 1, tr\u1ea3 v\u1ec1 1.<\/li>\n<li><code>factorial_recursive(2)<\/code> nh\u1eadn \u0111\u01b0\u1ee3c 1, t\u00ednh 2 * 1 = 2, tr\u1ea3 v\u1ec1 2.<\/li>\n<li><code>factorial_recursive(3)<\/code> nh\u1eadn \u0111\u01b0\u1ee3c 2, t\u00ednh 3 * 2 = 6, tr\u1ea3 v\u1ec1 6. K\u1ebft qu\u1ea3 cu\u1ed1i c\u00f9ng l\u00e0 6.<\/li>\n<\/ol>\n<h3><span class=\"ez-toc-section\" id=\"Vi-du-2-Tinh-so-Fibonacci-thu-n\"><\/span>V\u00ed d\u1ee5 2: T\u00ednh s\u1ed1 Fibonacci th\u1ee9 n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>D\u00e3y Fibonacci l\u00e0 m\u1ed9t d\u00e3y s\u1ed1 trong \u0111\u00f3 m\u1ed7i s\u1ed1 l\u00e0 t\u1ed5ng c\u1ee7a hai s\u1ed1 li\u1ec1n tr\u01b0\u1edbc n\u00f3. D\u00e3y th\u01b0\u1eddng b\u1eaft \u0111\u1ea7u b\u1eb1ng 0 v\u00e0 1.<\/p>\n<ul>\n<li><strong>\u0110\u1ecbnh ngh\u0129a:<\/strong> <code>Fib(n) = Fib(n-1) + Fib(n-2)<\/code><\/li>\n<li><strong>Tr\u01b0\u1eddng h\u1ee3p c\u01a1 s\u1edf (Base Cases):<\/strong> <code>Fib(0) = 0<\/code>, <code>Fib(1) = 1<\/code><\/li>\n<li><strong>B\u01b0\u1edbc \u0111\u1ec7 quy (Recursive Step):<\/strong> <code>Fib(n) = Fib(n-1) + Fib(n-2)<\/code> (v\u1edbi n &gt; 1)<\/li>\n<\/ul>\n<p>Python<\/p>\n<pre><code class=\"language-plaintext\"># Code Python t\u00ednh s\u1ed1 Fibonacci th\u1ee9 n b\u1eb1ng \u0111\u1ec7 quy\r\ndef fibonacci_recursive(n):\r\n  # C\u00e1c tr\u01b0\u1eddng h\u1ee3p c\u01a1 s\u1edf\r\n  if n &lt;= 0:\r\n    return 0\r\n  elif n == 1:\r\n    return 1\r\n  # B\u01b0\u1edbc \u0111\u1ec7 quy\r\n  else:\r\n    return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2)\r\n\r\n# V\u00ed d\u1ee5 s\u1eed d\u1ee5ng\r\nprint(f\"Fib(6) = {fibonacci_recursive(6)}\") # Output: Fib(6) = 8\r\nprint(f\"Fib(10) = {fibonacci_recursive(10)}\") # Output: Fib(10) = 55\r\n<\/code><\/pre>\n<p>JavaScript<\/p>\n<pre><code class=\"language-plaintext\">\/\/ Code JavaScript t\u00ednh s\u1ed1 Fibonacci th\u1ee9 n b\u1eb1ng \u0111\u1ec7 quy\r\nfunction fibonacciRecursive(n) {\r\n  \/\/ C\u00e1c tr\u01b0\u1eddng h\u1ee3p c\u01a1 s\u1edf\r\n  if (n &lt;= 0) {\r\n    return 0;\r\n  } else if (n === 1) {\r\n    return 1;\r\n  }\r\n  \/\/ B\u01b0\u1edbc \u0111\u1ec7 quy\r\n  else {\r\n    return fibonacciRecursive(n - 1) + fibonacciRecursive(n - 2);\r\n  }\r\n}\r\n\r\n\/\/ V\u00ed d\u1ee5 s\u1eed d\u1ee5ng\r\nconsole.log(`Fib(6) = ${fibonacciRecursive(6)}`); \/\/ Output: Fib(6) = 8\r\nconsole.log(`Fib(10) = ${fibonacciRecursive(10)}`); \/\/ Output: Fib(10) = 55\r\n<\/code><\/pre>\n<p>H\u00e0m <code>fibonacci_recursive<\/code> c\u00f3 hai Base Cases cho <code>n=0<\/code> v\u00e0 <code>n=1<\/code>. N\u1ebfu <code>n &gt; 1<\/code>, h\u00e0m g\u1ecdi l\u1ea1i ch\u00ednh n\u00f3 hai l\u1ea7n: m\u1ed9t l\u1ea7n cho <code>n-1<\/code> v\u00e0 m\u1ed9t l\u1ea7n cho <code>n-2<\/code>, sau \u0111\u00f3 c\u1ed9ng k\u1ebft qu\u1ea3 c\u1ee7a hai l\u1eddi g\u1ecdi \u0111\u00f3 l\u1ea1i.<\/p>\n<p>H\u00e3y xem x\u00e9t <code>fibonacci_recursive(4)<\/code>:<\/p>\n<ol>\n<li><code>fib(4)<\/code> g\u1ecdi <code>fib(3)<\/code> v\u00e0 <code>fib(2)<\/code>.<\/li>\n<li><code>fib(3)<\/code> g\u1ecdi <code>fib(2)<\/code> v\u00e0 <code>fib(1)<\/code> (tr\u1ea3 v\u1ec1 1).<\/li>\n<li><code>fib(2)<\/code> (l\u1ea7n 1, t\u1eeb fib(3)) g\u1ecdi <code>fib(1)<\/code> (tr\u1ea3 v\u1ec1 1) v\u00e0 <code>fib(0)<\/code> (tr\u1ea3 v\u1ec1 0). N\u00f3 t\u00ednh 1 + 0 = 1, tr\u1ea3 v\u1ec1 1.<\/li>\n<li><code>fib(3)<\/code> nh\u1eadn \u0111\u01b0\u1ee3c 1 (t\u1eeb fib(2)) v\u00e0 1 (t\u1eeb fib(1)), t\u00ednh 1 + 1 = 2, tr\u1ea3 v\u1ec1 2.<\/li>\n<li><code>fib(2)<\/code> (l\u1ea7n 2, t\u1eeb fib(4)) g\u1ecdi <code>fib(1)<\/code> (tr\u1ea3 v\u1ec1 1) v\u00e0 <code>fib(0)<\/code> (tr\u1ea3 v\u1ec1 0). N\u00f3 t\u00ednh 1 + 0 = 1, tr\u1ea3 v\u1ec1 1.<\/li>\n<li><code>fib(4)<\/code> nh\u1eadn \u0111\u01b0\u1ee3c 2 (t\u1eeb fib(3)) v\u00e0 1 (t\u1eeb fib(2)), t\u00ednh 2 + 1 = 3, tr\u1ea3 v\u1ec1 3. K\u1ebft qu\u1ea3 cu\u1ed1i c\u00f9ng l\u00e0 3.<\/li>\n<\/ol>\n<p>L\u01b0u \u00fd quan tr\u1ecdng: C\u00e1ch gi\u1ea3i \u0111\u1ec7 quy n\u00e0y cho Fibonacci r\u1ea5t tr\u1ef1c quan nh\u01b0ng l\u1ea1i kh\u00f4ng hi\u1ec7u qu\u1ea3. B\u1ea1n c\u00f3 th\u1ec3 th\u1ea5y <code>fib(2)<\/code> \u0111\u01b0\u1ee3c t\u00ednh to\u00e1n nhi\u1ec1u l\u1ea7n. V\u1edbi <code>n<\/code> l\u1edbn h\u01a1n, s\u1ed1 l\u1ea7n t\u00ednh to\u00e1n tr\u00f9ng l\u1eb7p t\u0103ng l\u00ean theo c\u1ea5p s\u1ed1 nh\u00e2n, l\u00e0m ch\u1eadm ch\u01b0\u01a1ng tr\u00ecnh \u0111\u00e1ng k\u1ec3. C\u00e1c k\u1ef9 thu\u1eadt nh\u01b0 <strong>memoization<\/strong> ho\u1eb7c <strong>dynamic programming (quy ho\u1ea1ch \u0111\u1ed9ng)<\/strong> th\u01b0\u1eddng \u0111\u01b0\u1ee3c d\u00f9ng \u0111\u1ec3 t\u1ed1i \u01b0u h\u00f3a.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Vi-du-3-De-quy-trong-bai-toan-Thap-Ha-Noi-Tower-of-Hanoi\"><\/span>V\u00ed d\u1ee5 3: \u0110\u1ec7 quy trong b\u00e0i to\u00e1n Th\u00e1p H\u00e0 N\u1ed9i (Tower of Hanoi)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Th\u00e1p H\u00e0 N\u1ed9i l\u00e0 m\u1ed9t tr\u00f2 ch\u01a1i to\u00e1n h\u1ecdc n\u1ed5i ti\u1ebfng, bao g\u1ed3m ba c\u1ecdc v\u00e0 m\u1ed9t s\u1ed1 \u0111\u0129a c\u00f3 k\u00edch th\u01b0\u1edbc kh\u00e1c nhau c\u00f3 th\u1ec3 tr\u01b0\u1ee3t l\u00ean b\u1ea5t k\u1ef3 c\u1ecdc n\u00e0o. C\u00e2u \u0111\u1ed1 b\u1eaft \u0111\u1ea7u v\u1edbi c\u00e1c \u0111\u0129a \u0111\u01b0\u1ee3c x\u1ebfp ch\u1ed3ng l\u00ean nhau theo th\u1ee9 t\u1ef1 k\u00edch th\u01b0\u1edbc gi\u1ea3m d\u1ea7n tr\u00ean m\u1ed9t c\u1ecdc (c\u1ecdc ngu\u1ed3n), sao cho \u0111\u0129a nh\u1ecf nh\u1ea5t \u1edf tr\u00ean c\u00f9ng.<\/p>\n<p>M\u1ee5c ti\u00eau l\u00e0 di chuy\u1ec3n to\u00e0n b\u1ed9 ch\u1ed3ng \u0111\u0129a sang m\u1ed9t c\u1ecdc kh\u00e1c (c\u1ecdc \u0111\u00edch), tu\u00e2n theo c\u00e1c quy t\u1eafc \u0111\u01a1n gi\u1ea3n sau:<\/p>\n<ol>\n<li>M\u1ed7i l\u1ea7n ch\u1ec9 \u0111\u01b0\u1ee3c di chuy\u1ec3n m\u1ed9t \u0111\u0129a.<\/li>\n<li>M\u1ed9t \u0111\u0129a ch\u1ec9 c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c di chuy\u1ec3n n\u1ebfu n\u00f3 l\u00e0 \u0111\u0129a tr\u00ean c\u00f9ng c\u1ee7a m\u1ed9t ch\u1ed3ng.<\/li>\n<li>Kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1eb7t \u0111\u0129a l\u1edbn h\u01a1n l\u00ean tr\u00ean \u0111\u0129a nh\u1ecf h\u01a1n.<\/li>\n<\/ol>\n<p>B\u00e0i to\u00e1n n\u00e0y c\u00f3 l\u1eddi gi\u1ea3i \u0111\u1ec7 quy r\u1ea5t thanh l\u1ecbch. \u0110\u1ec3 di chuy\u1ec3n <code>n<\/code> \u0111\u0129a t\u1eeb c\u1ecdc Ngu\u1ed3n (A) sang c\u1ecdc \u0110\u00edch (C), s\u1eed d\u1ee5ng c\u1ecdc Trung gian (B):<\/p>\n<ol>\n<li>Di chuy\u1ec3n <code>n-1<\/code> \u0111\u0129a t\u1eeb A sang B, s\u1eed d\u1ee5ng C l\u00e0m trung gian. (B\u01b0\u1edbc \u0111\u1ec7 quy)<\/li>\n<li>Di chuy\u1ec3n \u0111\u0129a th\u1ee9 <code>n<\/code> (\u0111\u0129a l\u1edbn nh\u1ea5t) t\u1eeb A sang C. (H\u00e0nh \u0111\u1ed9ng c\u01a1 b\u1ea3n)<\/li>\n<li>Di chuy\u1ec3n <code>n-1<\/code> \u0111\u0129a t\u1eeb B sang C, s\u1eed d\u1ee5ng A l\u00e0m trung gian. (B\u01b0\u1edbc \u0111\u1ec7 quy)<\/li>\n<\/ol>\n<ul>\n<li><strong>Tr\u01b0\u1eddng h\u1ee3p c\u01a1 s\u1edf (Base Case):<\/strong> Khi <code>n = 0<\/code> (kh\u00f4ng c\u00f3 \u0111\u0129a n\u00e0o \u0111\u1ec3 di chuy\u1ec3n), kh\u00f4ng l\u00e0m g\u00ec c\u1ea3.<\/li>\n<\/ul>\n<p>Python<\/p>\n<pre><code class=\"language-plaintext\"># Code Python gi\u1ea3i b\u00e0i to\u00e1n Th\u00e1p H\u00e0 N\u1ed9i b\u1eb1ng \u0111\u1ec7 quy\r\ndef tower_of_hanoi(n, source, destination, auxiliary):\r\n  # Tr\u01b0\u1eddng h\u1ee3p c\u01a1 s\u1edf\r\n  if n == 1:\r\n    print(f\"Di chuy\u1ec3n \u0111\u0129a 1 t\u1eeb {source} sang {destination}\")\r\n    return\r\n  # B\u01b0\u1edbc \u0111\u1ec7 quy\r\n  # 1. Di chuy\u1ec3n n-1 \u0111\u0129a t\u1eeb ngu\u1ed3n sang trung gian\r\n  tower_of_hanoi(n - 1, source, auxiliary, destination)\r\n  # 2. Di chuy\u1ec3n \u0111\u0129a l\u1edbn nh\u1ea5t t\u1eeb ngu\u1ed3n sang \u0111\u00edch\r\n  print(f\"Di chuy\u1ec3n \u0111\u0129a {n} t\u1eeb {source} sang {destination}\")\r\n  # 3. Di chuy\u1ec3n n-1 \u0111\u0129a t\u1eeb trung gian sang \u0111\u00edch\r\n  tower_of_hanoi(n - 1, auxiliary, destination, source)\r\n\r\n# V\u00ed d\u1ee5 s\u1eed d\u1ee5ng v\u1edbi 3 \u0111\u0129a\r\nn_disks = 3\r\nprint(f\"C\u00e1c b\u01b0\u1edbc di chuy\u1ec3n {n_disks} \u0111\u0129a t\u1eeb A sang C:\")\r\ntower_of_hanoi(n_disks, 'A', 'C', 'B')\r\n<\/code><\/pre>\n<p>JavaScript<\/p>\n<pre><code class=\"language-plaintext\">\/\/ Code JavaScript gi\u1ea3i b\u00e0i to\u00e1n Th\u00e1p H\u00e0 N\u1ed9i b\u1eb1ng \u0111\u1ec7 quy\r\nfunction towerOfHanoi(n, source, destination, auxiliary) {\r\n  \/\/ Tr\u01b0\u1eddng h\u1ee3p c\u01a1 s\u1edf (thay v\u00ec n=0, ta d\u1eebng khi n=1 v\u00e0 th\u1ef1c hi\u1ec7n di chuy\u1ec3n)\r\n  if (n === 1) {\r\n    console.log(`Di chuy\u1ec3n \u0111\u0129a 1 t\u1eeb ${source} sang ${destination}`);\r\n    return;\r\n  }\r\n  \/\/ B\u01b0\u1edbc \u0111\u1ec7 quy\r\n  \/\/ 1. Di chuy\u1ec3n n-1 \u0111\u0129a t\u1eeb ngu\u1ed3n sang trung gian\r\n  towerOfHanoi(n - 1, source, auxiliary, destination);\r\n  \/\/ 2. Di chuy\u1ec3n \u0111\u0129a l\u1edbn nh\u1ea5t t\u1eeb ngu\u1ed3n sang \u0111\u00edch\r\n  console.log(`Di chuy\u1ec3n \u0111\u0129a ${n} t\u1eeb ${source} sang ${destination}`);\r\n  \/\/ 3. Di chuy\u1ec3n n-1 \u0111\u0129a t\u1eeb trung gian sang \u0111\u00edch\r\n  towerOfHanoi(n - 1, auxiliary, destination, source);\r\n}\r\n\r\n\/\/ V\u00ed d\u1ee5 s\u1eed d\u1ee5ng v\u1edbi 3 \u0111\u0129a\r\nconst nDisks = 3;\r\nconsole.log(`C\u00e1c b\u01b0\u1edbc di chuy\u1ec3n ${nDisks} \u0111\u0129a t\u1eeb A sang C:`);\r\ntowerOfHanoi(nDisks, 'A', 'C', 'B');\r\n<\/code><\/pre>\n<p>H\u00e0m <code>tower_of_hanoi<\/code> nh\u1eadn s\u1ed1 l\u01b0\u1ee3ng \u0111\u0129a <code>n<\/code> v\u00e0 t\u00ean c\u1ee7a ba c\u1ecdc. Base Case l\u00e0 khi ch\u1ec9 c\u00f2n 1 \u0111\u0129a, ta ch\u1ec9 c\u1ea7n di chuy\u1ec3n n\u00f3 tr\u1ef1c ti\u1ebfp. B\u01b0\u1edbc \u0111\u1ec7 quy th\u1ef1c hi\u1ec7n ch\u00ednh x\u00e1c ba b\u01b0\u1edbc logic \u0111\u00e3 n\u00eau: hai l\u1eddi g\u1ecdi \u0111\u1ec7 quy \u0111\u1ec3 di chuy\u1ec3n <code>n-1<\/code> \u0111\u0129a v\u00e0 m\u1ed9t h\u00e0nh \u0111\u1ed9ng di chuy\u1ec3n \u0111\u0129a l\u1edbn nh\u1ea5t \u1edf gi\u1eefa.<\/p>\n<p>B\u00e0i to\u00e1n Th\u00e1p H\u00e0 N\u1ed9i l\u00e0 m\u1ed9t minh ch\u1ee9ng tuy\u1ec7t v\u1eddi cho th\u1ea5y \u0111\u1ec7 quy c\u00f3 th\u1ec3 di\u1ec5n \u0111\u1ea1t l\u1eddi gi\u1ea3i cho m\u1ed9t s\u1ed1 v\u1ea5n \u0111\u1ec1 ph\u1ee9c t\u1ea1p m\u1ed9t c\u00e1ch ng\u1eafn g\u1ecdn v\u00e0 t\u1ef1 nhi\u00ean, ph\u1ea3n \u00e1nh \u0111\u00fang c\u1ea5u tr\u00fac c\u1ee7a b\u00e0i to\u00e1n.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"De-quy-va-Ngan-xep-loi-goi-ham-Call-Stack\"><\/span>\u0110\u1ec7 quy v\u00e0 Ng\u0103n x\u1ebfp l\u1eddi g\u1ecdi h\u00e0m (Call Stack)<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Ho\u1ea1t \u0111\u1ed9ng c\u1ee7a \u0111\u1ec7 quy g\u1eafn li\u1ec1n v\u1edbi m\u1ed9t c\u1ea5u tr\u00fac d\u1eef li\u1ec7u quan tr\u1ecdng trong <strong>b\u1ed9 nh\u1edb (memory)<\/strong> c\u1ee7a m\u00e1y t\u00ednh: <strong>Ng\u0103n x\u1ebfp l\u1eddi g\u1ecdi h\u00e0m (Call Stack)<\/strong>. Hi\u1ec3u v\u1ec1 Call Stack gi\u00fap l\u00e0m s\u00e1ng t\u1ecf c\u00e1ch \u0111\u1ec7 quy th\u1ef1c s\u1ef1 ho\u1ea1t \u0111\u1ed9ng &#8220;b\u00ean trong&#8221; v\u00e0 t\u1ea1i sao l\u1ea1i c\u00f3 l\u1ed7i <strong>Stack Overflow<\/strong>.<\/p>\n<p>Call Stack l\u00e0 m\u1ed9t c\u1ea5u tr\u00fac d\u1eef li\u1ec7u d\u1ea1ng <strong>ng\u0103n x\u1ebfp (Stack)<\/strong>, ho\u1ea1t \u0111\u1ed9ng theo nguy\u00ean t\u1eafc <strong>LIFO (Last-In, First-Out &#8211; V\u00e0o sau, Ra tr\u01b0\u1edbc)<\/strong>. M\u1ed7i khi m\u1ed9t h\u00e0m \u0111\u01b0\u1ee3c g\u1ecdi trong ch\u01b0\u01a1ng tr\u00ecnh, m\u1ed9t &#8220;khung&#8221; (stack frame) m\u1edbi ch\u1ee9a th\u00f4ng tin v\u1ec1 l\u1eddi g\u1ecdi h\u00e0m \u0111\u00f3 s\u1ebd \u0111\u01b0\u1ee3c \u0111\u1ea9y (push) l\u00ean \u0111\u1ec9nh c\u1ee7a Call Stack.<\/p>\n<p>Khung ng\u0103n x\u1ebfp n\u00e0y l\u01b0u tr\u1eef c\u00e1c th\u00f4ng tin quan tr\u1ecdng nh\u01b0: c\u00e1c bi\u1ebfn c\u1ee5c b\u1ed9 c\u1ee7a h\u00e0m, c\u00e1c tham s\u1ed1 truy\u1ec1n v\u00e0o, v\u00e0 \u0111\u1ecba ch\u1ec9 tr\u1ea3 v\u1ec1 (n\u01a1i ch\u01b0\u01a1ng tr\u00ecnh s\u1ebd ti\u1ebfp t\u1ee5c th\u1ef1c thi sau khi h\u00e0m n\u00e0y k\u1ebft th\u00fac). Khi m\u1ed9t h\u00e0m th\u1ef1c hi\u1ec7n xong v\u00e0 tr\u1ea3 v\u1ec1 k\u1ebft qu\u1ea3, khung ng\u0103n x\u1ebfp t\u01b0\u01a1ng \u1ee9ng c\u1ee7a n\u00f3 s\u1ebd \u0111\u01b0\u1ee3c l\u1ea5y ra (pop) kh\u1ecfi \u0111\u1ec9nh Call Stack.<\/p>\n<p>Trong tr\u01b0\u1eddng h\u1ee3p h\u00e0m \u0111\u1ec7 quy, m\u1ed7i l\u1ea7n h\u00e0m g\u1ecdi l\u1ea1i ch\u00ednh n\u00f3, m\u1ed9t khung ng\u0103n x\u1ebfp <i>m\u1edbi<\/i> l\u1ea1i \u0111\u01b0\u1ee3c \u0111\u1ea9y l\u00ean Call Stack. V\u00ed d\u1ee5, khi g\u1ecdi <code>factorial_recursive(3)<\/code>:<\/p>\n<ol>\n<li>Khung cho <code>factorial_recursive(3)<\/code> \u0111\u01b0\u1ee3c \u0111\u1ea9y v\u00e0o stack.<\/li>\n<li>N\u00f3 g\u1ecdi <code>factorial_recursive(2)<\/code>, khung cho <code>factorial_recursive(2)<\/code> \u0111\u01b0\u1ee3c \u0111\u1ea9y l\u00ean tr\u00ean.<\/li>\n<li>N\u00f3 g\u1ecdi <code>factorial_recursive(1)<\/code>, khung cho <code>factorial_recursive(1)<\/code> \u0111\u01b0\u1ee3c \u0111\u1ea9y l\u00ean tr\u00ean.<\/li>\n<li>N\u00f3 g\u1ecdi <code>factorial_recursive(0)<\/code>, khung cho <code>factorial_recursive(0)<\/code> \u0111\u01b0\u1ee3c \u0111\u1ea9y l\u00ean tr\u00ean.<\/li>\n<li><code>factorial_recursive(0)<\/code> g\u1eb7p Base Case, tr\u1ea3 v\u1ec1 1. Khung c\u1ee7a n\u00f3 \u0111\u01b0\u1ee3c pop ra.<\/li>\n<li><code>factorial_recursive(1)<\/code> nh\u1eadn k\u1ebft qu\u1ea3, t\u00ednh to\u00e1n, tr\u1ea3 v\u1ec1 1. Khung c\u1ee7a n\u00f3 \u0111\u01b0\u1ee3c pop ra.<\/li>\n<li><code>factorial_recursive(2)<\/code> nh\u1eadn k\u1ebft qu\u1ea3, t\u00ednh to\u00e1n, tr\u1ea3 v\u1ec1 2. Khung c\u1ee7a n\u00f3 \u0111\u01b0\u1ee3c pop ra.<\/li>\n<li><code>factorial_recursive(3)<\/code> nh\u1eadn k\u1ebft qu\u1ea3, t\u00ednh to\u00e1n, tr\u1ea3 v\u1ec1 6. Khung c\u1ee7a n\u00f3 \u0111\u01b0\u1ee3c pop ra. Stack tr\u1edf l\u1ea1i tr\u1ea1ng th\u00e1i ban \u0111\u1ea7u.<\/li>\n<\/ol>\n<p>\u0110i\u1ec1u g\u00ec x\u1ea3y ra n\u1ebfu h\u00e0m \u0111\u1ec7 quy g\u1ecdi ch\u00ednh n\u00f3 qu\u00e1 nhi\u1ec1u l\u1ea7n m\u00e0 kh\u00f4ng \u0111\u1ea1t \u0111\u1ebfn tr\u01b0\u1eddng h\u1ee3p c\u01a1 s\u1edf? Ho\u1eb7c n\u1ebfu Base Case b\u1ecb \u0111\u1ecbnh ngh\u0129a sai v\u00e0 kh\u00f4ng bao gi\u1edd \u0111\u1ea1t \u0111\u01b0\u1ee3c? M\u1ed7i l\u1eddi g\u1ecdi \u0111\u1ec7 quy s\u1ebd ti\u1ebfp t\u1ee5c \u0111\u1ea9y th\u00eam m\u1ed9t khung m\u1edbi v\u00e0o Call Stack.<\/p>\n<p>Call Stack, gi\u1ed1ng nh\u01b0 m\u1ecdi v\u00f9ng nh\u1edb kh\u00e1c, c\u00f3 k\u00edch th\u01b0\u1edbc gi\u1edbi h\u1ea1n. Khi s\u1ed1 l\u01b0\u1ee3ng khung ng\u0103n x\u1ebfp b\u1ecb \u0111\u1ea9y v\u00e0o v\u01b0\u1ee3t qu\u00e1 dung l\u01b0\u1ee3ng cho ph\u00e9p c\u1ee7a Call Stack, ch\u01b0\u01a1ng tr\u00ecnh s\u1ebd kh\u00f4ng c\u00f2n \u0111\u1ee7 b\u1ed9 nh\u1edb \u0111\u1ec3 qu\u1ea3n l\u00fd th\u00eam l\u1eddi g\u1ecdi h\u00e0m n\u00e0o n\u1eefa. L\u00fac n\u00e0y, m\u1ed9t l\u1ed7i nghi\u00eam tr\u1ecdng x\u1ea3y ra, g\u1ecdi l\u00e0 <strong>Stack Overflow (Tr\u00e0n b\u1ed9 nh\u1edb stack)<\/strong>, v\u00e0 ch\u01b0\u01a1ng tr\u00ecnh th\u01b0\u1eddng s\u1ebd b\u1ecb d\u1eebng \u0111\u1ed9t ng\u1ed9t.<\/p>\n<p>V\u00ec v\u1eady, hi\u1ec3u r\u00f5 m\u1ed1i li\u00ean h\u1ec7 gi\u1eefa \u0111\u1ec7 quy v\u00e0 Call Stack l\u00e0 c\u1ef1c k\u1ef3 quan tr\u1ecdng. N\u00f3 kh\u00f4ng ch\u1ec9 gi\u00fap b\u1ea1n h\u00ecnh dung c\u00e1ch \u0111\u1ec7 quy ho\u1ea1t \u0111\u1ed9ng m\u00e0 c\u00f2n gi\u00fap nh\u1eadn bi\u1ebft v\u00e0 g\u1ee1 l\u1ed7i c\u00e1c v\u1ea5n \u0111\u1ec1 li\u00ean quan \u0111\u1ebfn \u0111\u1ec7 quy s\u00e2u ho\u1eb7c v\u00f4 h\u1ea1n, \u0111\u1eb7c bi\u1ec7t l\u00e0 l\u1ed7i Stack Overflow ph\u1ed5 bi\u1ebfn.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2025\/04\/De-quy-Recursion-02.jpg\" alt=\"\u0110\u1ec7 quy (Recursion) 02\" width=\"750\" height=\"378\" class=\"aligncenter size-full wp-image-27525\" title=\"\" srcset=\"https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2025\/04\/De-quy-Recursion-02.jpg 750w, https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2025\/04\/De-quy-Recursion-02-300x151.jpg 300w, https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2025\/04\/De-quy-Recursion-02-360x180.jpg 360w\" sizes=\"auto, (max-width: 750px) 100vw, 750px\" \/><\/p>\n<h2><span class=\"ez-toc-section\" id=\"So-sanh-De-quy-Recursion-va-Vong-lap-Iteration\"><\/span>So s\u00e1nh \u0110\u1ec7 quy (Recursion) v\u00e0 V\u00f2ng l\u1eb7p (Iteration)<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0110\u1ec7 quy v\u00e0 <strong>v\u00f2ng l\u1eb7p (iteration)<\/strong> (s\u1eed d\u1ee5ng c\u00e1c c\u1ea5u tr\u00fac nh\u01b0 <code>for<\/code>, <code>while<\/code>) l\u00e0 hai c\u00e1ch ch\u00ednh \u0111\u1ec3 th\u1ef1c hi\u1ec7n c\u00e1c t\u00e1c v\u1ee5 l\u1eb7p \u0111i l\u1eb7p l\u1ea1i trong l\u1eadp tr\u00ecnh. M\u1eb7c d\u00f9 ch\u00fang c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 gi\u1ea3i quy\u1ebft c\u00f9ng m\u1ed9t lo\u1ea1i b\u00e0i to\u00e1n, ch\u00fang ho\u1ea1t \u0111\u1ed9ng theo nh\u1eefng c\u00e1ch r\u1ea5t kh\u00e1c nhau. Vi\u1ec7c hi\u1ec3u r\u00f5 s\u1ef1 kh\u00e1c bi\u1ec7t gi\u00fap l\u1eadp tr\u00ecnh vi\u00ean l\u1ef1a ch\u1ecdn c\u00f4ng c\u1ee5 ph\u00f9 h\u1ee3p.<\/p>\n<p>V\u1ec1 logic th\u1ef1c thi, \u0111\u1ec7 quy gi\u1ea3i quy\u1ebft b\u00e0i to\u00e1n b\u1eb1ng c\u00e1ch g\u1ecdi l\u1ea1i ch\u00ednh n\u00f3 v\u1edbi c\u00e1c phi\u00ean b\u1ea3n nh\u1ecf h\u01a1n cho \u0111\u1ebfn khi \u0111\u1ea1t Base Case. Trong khi \u0111\u00f3, v\u00f2ng l\u1eb7p th\u1ef1c hi\u1ec7n l\u1eb7p l\u1ea1i m\u1ed9t kh\u1ed1i m\u00e3 d\u1ef1a tr\u00ean m\u1ed9t \u0111i\u1ec1u ki\u1ec7n l\u1eb7p v\u00e0 th\u01b0\u1eddng s\u1eed d\u1ee5ng c\u00e1c bi\u1ebfn \u0111\u1ebfm ho\u1eb7c bi\u1ebfn tr\u1ea1ng th\u00e1i \u0111\u1ec3 ki\u1ec3m so\u00e1t qu\u00e1 tr\u00ecnh l\u1eb7p.<\/p>\n<p>Qu\u1ea3n l\u00fd tr\u1ea1ng th\u00e1i c\u0169ng kh\u00e1c bi\u1ec7t. \u0110\u1ec7 quy qu\u1ea3n l\u00fd tr\u1ea1ng th\u00e1i c\u1ee7a c\u00e1c b\u01b0\u1edbc trung gian m\u1ed9t c\u00e1ch ng\u1ea7m \u0111\u1ecbnh th\u00f4ng qua c\u00e1c khung tr\u00ean Call Stack (m\u1ed7i khung l\u01b0u tr\u1eef tr\u1ea1ng th\u00e1i c\u1ee7a m\u1ed9t l\u1ea7n g\u1ecdi). V\u00f2ng l\u1eb7p \u0111\u00f2i h\u1ecfi l\u1eadp tr\u00ecnh vi\u00ean ph\u1ea3i qu\u1ea3n l\u00fd tr\u1ea1ng th\u00e1i m\u1ed9t c\u00e1ch t\u01b0\u1eddng minh th\u00f4ng qua c\u00e1c bi\u1ebfn \u0111\u01b0\u1ee3c c\u1eadp nh\u1eadt trong m\u1ed7i l\u1ea7n l\u1eb7p.<\/p>\n<p>V\u1ec1 c\u1ea5u tr\u00fac code, h\u00e0m \u0111\u1ec7 quy th\u01b0\u1eddng c\u00f3 v\u1ebb ng\u1eafn g\u1ecdn v\u00e0 thanh l\u1ecbch h\u01a1n \u0111\u1ed1i v\u1edbi c\u00e1c b\u00e0i to\u00e1n c\u00f3 c\u1ea5u tr\u00fac \u0111\u1ec7 quy t\u1ef1 nhi\u00ean (nh\u01b0 duy\u1ec7t c\u00e2y). Code v\u00f2ng l\u1eb7p \u0111\u00f4i khi c\u00f3 th\u1ec3 d\u00e0i h\u01a1n nh\u01b0ng lu\u1ed3ng th\u1ef1c thi th\u01b0\u1eddng tu\u1ea7n t\u1ef1 v\u00e0 d\u1ec5 theo d\u00f5i h\u01a1n \u0111\u1ed1i v\u1edbi m\u1ed9t s\u1ed1 ng\u01b0\u1eddi.<\/p>\n<p>S\u1eed d\u1ee5ng b\u1ed9 nh\u1edb l\u00e0 m\u1ed9t \u0111i\u1ec3m kh\u00e1c bi\u1ec7t l\u1edbn. M\u1ed7i l\u1eddi g\u1ecdi \u0111\u1ec7 quy ti\u00eau t\u1ed1n th\u00eam kh\u00f4ng gian tr\u00ean Call Stack. N\u1ebfu \u0111\u1ec7 quy qu\u00e1 s\u00e2u, nguy c\u01a1 <strong>Stack Overflow<\/strong> l\u00e0 r\u1ea5t cao. V\u00f2ng l\u1eb7p th\u01b0\u1eddng ch\u1ec9 s\u1eed d\u1ee5ng m\u1ed9t l\u01b0\u1ee3ng b\u1ed9 nh\u1edb t\u01b0\u01a1ng \u0111\u1ed1i c\u1ed1 \u0111\u1ecbnh (cho c\u00e1c bi\u1ebfn l\u1eb7p), \u00edt r\u1ee7i ro v\u1ec1 tr\u00e0n b\u1ed9 nh\u1edb stack h\u01a1n nhi\u1ec1u.<\/p>\n<p>V\u1ec1 hi\u1ec7u su\u1ea5t, c\u00e1c l\u1eddi g\u1ecdi h\u00e0m trong \u0111\u1ec7 quy th\u01b0\u1eddng \u0111i k\u00e8m v\u1edbi chi ph\u00ed (overhead) nh\u1ea5t \u0111\u1ecbnh, c\u00f3 th\u1ec3 l\u00e0m cho \u0111\u1ec7 quy ch\u1eadm h\u01a1n so v\u1edbi v\u00f2ng l\u1eb7p t\u01b0\u01a1ng \u0111\u01b0\u01a1ng, \u0111\u1eb7c bi\u1ec7t v\u1edbi c\u00e1c t\u00e1c v\u1ee5 \u0111\u01a1n gi\u1ea3n. V\u00f2ng l\u1eb7p th\u01b0\u1eddng c\u00f3 hi\u1ec7u su\u1ea5t t\u1ed1t h\u01a1n trong nh\u1eefng tr\u01b0\u1eddng h\u1ee3p n\u00e0y. Tuy nhi\u00ean, c\u1ea7n l\u01b0u \u00fd v\u1ec1 k\u1ef9 thu\u1eadt <strong>T\u1ed1i \u01b0u h\u00f3a \u0110\u1ec7 quy \u0110u\u00f4i (Tail Call Optimization &#8211; TCO)<\/strong> c\u00f3 th\u1ec3 gi\u00fap lo\u1ea1i b\u1ecf overhead n\u00e0y trong m\u1ed9t s\u1ed1 ng\u00f4n ng\u1eef\/<a href=\"https:\/\/interdata.vn\/blog\/compiler-trinh-bien-dich-la-gi\/\">tr\u00ecnh bi\u00ean d\u1ecbch<\/a> (s\u1ebd n\u00f3i th\u00eam \u1edf ph\u1ea7n FAQ).<\/p>\n<p>Kh\u1ea3 n\u0103ng \u0111\u1ecdc v\u00e0 g\u1ee1 l\u1ed7i (debug) kh\u00e1 ch\u1ee7 quan. Code \u0111\u1ec7 quy c\u00f3 th\u1ec3 r\u1ea5t d\u1ec5 \u0111\u1ecdc n\u1ebfu b\u1ea1n hi\u1ec3u r\u00f5 logic \u0111\u1ec7 quy v\u00e0 b\u00e0i to\u00e1n ph\u00f9 h\u1ee3p. Tuy nhi\u00ean, vi\u1ec7c debug \u0111\u1ec7 quy c\u00f3 th\u1ec3 ph\u1ee9c t\u1ea1p h\u01a1n do ph\u1ea3i theo d\u00f5i nhi\u1ec1u ng\u1eef c\u1ea3nh h\u00e0m tr\u00ean Call Stack. Code v\u00f2ng l\u1eb7p th\u01b0\u1eddng d\u1ec5 debug h\u01a1n v\u00ec lu\u1ed3ng th\u1ef1c thi tuy\u1ebfn t\u00ednh h\u01a1n.<\/p>\n<p><strong>B\u1ea3ng t\u00f3m t\u1eaft so s\u00e1nh:<\/strong><\/p>\n<figure class=\"table\">\n<table>\n<thead>\n<tr>\n<th>Ti\u00eau ch\u00ed<\/th>\n<th>\u0110\u1ec7 quy (Recursion)<\/th>\n<th>V\u00f2ng l\u1eb7p (Iteration)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Logic<\/strong><\/td>\n<td>G\u1ecdi l\u1ea1i ch\u00ednh h\u00e0m, c\u00f3 Base Case &amp; Recursive Step<\/td>\n<td>L\u1eb7p l\u1ea1i kh\u1ed1i m\u00e3 d\u1ef1a tr\u00ean \u0111i\u1ec1u ki\u1ec7n, d\u00f9ng bi\u1ebfn tr\u1ea1ng th\u00e1i<\/td>\n<\/tr>\n<tr>\n<td><strong>Qu\u1ea3n l\u00fd tr\u1ea1ng th\u00e1i<\/strong><\/td>\n<td>Ng\u1ea7m \u0111\u1ecbnh qua Call Stack<\/td>\n<td>T\u01b0\u1eddng minh qua c\u00e1c bi\u1ebfn l\u1eb7p<\/td>\n<\/tr>\n<tr>\n<td><strong>Code<\/strong><\/td>\n<td>Th\u01b0\u1eddng ng\u1eafn g\u1ecdn, thanh l\u1ecbch cho b\u00e0i to\u00e1n ph\u00f9 h\u1ee3p<\/td>\n<td>C\u00f3 th\u1ec3 d\u00e0i h\u01a1n, lu\u1ed3ng th\u1ef1c thi tu\u1ea7n t\u1ef1 h\u01a1n<\/td>\n<\/tr>\n<tr>\n<td><strong>B\u1ed9 nh\u1edb<\/strong><\/td>\n<td>T\u1ed1n b\u1ed9 nh\u1edb Stack, nguy c\u01a1 Stack Overflow cao<\/td>\n<td>Th\u01b0\u1eddng t\u1ed1n \u00edt b\u1ed9 nh\u1edb h\u01a1n, \u00edt nguy c\u01a1 tr\u00e0n Stack<\/td>\n<\/tr>\n<tr>\n<td><strong>Hi\u1ec7u su\u1ea5t<\/strong><\/td>\n<td>C\u00f3 th\u1ec3 ch\u1eadm h\u01a1n do overhead g\u1ecdi h\u00e0m<\/td>\n<td>Th\u01b0\u1eddng nhanh h\u01a1n cho c\u00e1c t\u00e1c v\u1ee5 \u0111\u01a1n gi\u1ea3n<\/td>\n<\/tr>\n<tr>\n<td><strong>Debug<\/strong><\/td>\n<td>C\u00f3 th\u1ec3 kh\u00f3 h\u01a1n do Call Stack ph\u1ee9c t\u1ea1p<\/td>\n<td>Th\u01b0\u1eddng d\u1ec5 h\u01a1n do lu\u1ed3ng tuy\u1ebfn t\u00ednh<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h2><span class=\"ez-toc-section\" id=\"Uu-diem-va-nhuoc-diem-cua-viec-su-dung-De-quy\"><\/span>\u01afu \u0111i\u1ec3m v\u00e0 nh\u01b0\u1ee3c \u0111i\u1ec3m c\u1ee7a vi\u1ec7c s\u1eed d\u1ee5ng \u0110\u1ec7 quy<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Nh\u01b0 m\u1ecdi c\u00f4ng c\u1ee5 l\u1eadp tr\u00ecnh kh\u00e1c, \u0111\u1ec7 quy c\u00f3 nh\u1eefng \u0111i\u1ec3m m\u1ea1nh v\u00e0 \u0111i\u1ec3m y\u1ebfu ri\u00eang. Hi\u1ec3u r\u00f5 ch\u00fang gi\u00fap b\u1ea1n \u0111\u01b0a ra quy\u1ebft \u0111\u1ecbnh s\u00e1ng su\u1ed1t v\u1ec1 vi\u1ec7c c\u00f3 n\u00ean \u00e1p d\u1ee5ng k\u1ef9 thu\u1eadt n\u00e0y v\u00e0o gi\u1ea3i ph\u00e1p c\u1ee7a m\u00ecnh hay kh\u00f4ng.<\/p>\n<p><strong>\u01afu \u0111i\u1ec3m c\u1ee7a \u0110\u1ec7 quy:<\/strong><\/p>\n<ol>\n<li><strong>Code r\u00f5 r\u00e0ng v\u00e0 thanh l\u1ecbch:<\/strong> \u0110\u1ed1i v\u1edbi c\u00e1c b\u00e0i to\u00e1n c\u00f3 c\u1ea5u tr\u00fac v\u1ed1n \u0111\u00e3 mang t\u00ednh \u0111\u1ec7 quy (nh\u01b0 l\u00e0m vi\u1ec7c v\u1edbi c\u00e2y, \u0111\u1ed3 th\u1ecb, c\u00e1c b\u00e0i to\u00e1n chia \u0111\u1ec3 tr\u1ecb nh\u01b0 Quicksort, Mergesort), vi\u1ec7c s\u1eed d\u1ee5ng \u0111\u1ec7 quy th\u01b0\u1eddng d\u1eabn \u0111\u1ebfn m\u00e3 ngu\u1ed3n ng\u1eafn g\u1ecdn, d\u1ec5 \u0111\u1ecdc v\u00e0 th\u1ec3 hi\u1ec7n logic c\u1ee7a gi\u1ea3i thu\u1eadt m\u1ed9t c\u00e1ch t\u1ef1 nhi\u00ean h\u01a1n so v\u1edbi d\u00f9ng v\u00f2ng l\u1eb7p.<\/li>\n<li><strong>Gi\u1ea3m \u0111\u1ed9 ph\u1ee9c t\u1ea1p c\u1ee7a code (\u0111\u00f4i khi):<\/strong> Trong m\u1ed9t s\u1ed1 tr\u01b0\u1eddng h\u1ee3p, vi\u1ec7c tri\u1ec3n khai b\u1eb1ng \u0111\u1ec7 quy c\u00f3 th\u1ec3 \u0111\u01a1n gi\u1ea3n h\u01a1n, c\u1ea7n \u00edt bi\u1ebfn tr\u1ea1ng th\u00e1i t\u1ea1m th\u1eddi h\u01a1n so v\u1edbi vi\u1ec7c ph\u1ea3i qu\u1ea3n l\u00fd ch\u00fang m\u1ed9t c\u00e1ch t\u01b0\u1eddng minh trong v\u00f2ng l\u1eb7p.<\/li>\n<\/ol>\n<p><strong>Nh\u01b0\u1ee3c \u0111i\u1ec3m c\u1ee7a \u0110\u1ec7 quy:<\/strong><\/p>\n<ol>\n<li><strong>Ti\u00eau t\u1ed1n b\u1ed9 nh\u1edb:<\/strong> \u0110\u00e2y l\u00e0 nh\u01b0\u1ee3c \u0111i\u1ec3m l\u1edbn nh\u1ea5t. M\u1ed7i l\u1eddi g\u1ecdi \u0111\u1ec7 quy t\u1ea1o ra m\u1ed9t khung m\u1edbi tr\u00ean Call Stack. V\u1edbi \u0111\u1ed9 s\u00e2u \u0111\u1ec7 quy l\u1edbn, l\u01b0\u1ee3ng b\u1ed9 nh\u1edb ti\u00eau th\u1ee5 c\u00f3 th\u1ec3 t\u0103ng l\u00ean \u0111\u00e1ng k\u1ec3, d\u1eabn \u0111\u1ebfn nguy c\u01a1 <strong>Stack Overflow<\/strong>, \u0111\u1eb7c bi\u1ec7t trong c\u00e1c m\u00f4i tr\u01b0\u1eddng c\u00f3 gi\u1edbi h\u1ea1n b\u1ed9 nh\u1edb stack ch\u1eb7t ch\u1ebd.<\/li>\n<li><strong>Hi\u1ec7u su\u1ea5t th\u1ea5p h\u01a1n (th\u01b0\u1eddng):<\/strong> Chi ph\u00ed (overhead) li\u00ean quan \u0111\u1ebfn vi\u1ec7c g\u1ecdi v\u00e0 tr\u1ea3 v\u1ec1 t\u1eeb h\u00e0m c\u00f3 th\u1ec3 l\u00e0m cho \u0111\u1ec7 quy ch\u1eadm h\u01a1n so v\u1edbi m\u1ed9t gi\u1ea3i ph\u00e1p v\u00f2ng l\u1eb7p t\u01b0\u01a1ng \u0111\u01b0\u01a1ng cho c\u00f9ng m\u1ed9t b\u00e0i to\u00e1n, \u0111\u1eb7c bi\u1ec7t l\u00e0 khi c\u00e1c ph\u00e9p t\u00ednh trong m\u1ed7i b\u01b0\u1edbc l\u00e0 \u0111\u01a1n gi\u1ea3n.<\/li>\n<li><strong>Kh\u00f3 debug h\u01a1n:<\/strong> Vi\u1ec7c theo d\u00f5i lu\u1ed3ng th\u1ef1c thi qua nhi\u1ec1u c\u1ea5p \u0111\u1ed9 c\u1ee7a Call Stack c\u00f3 th\u1ec3 ph\u1ee9c t\u1ea1p h\u01a1n so v\u1edbi vi\u1ec7c theo d\u00f5i c\u00e1c bi\u1ebfn thay \u0111\u1ed5i trong m\u1ed9t v\u00f2ng l\u1eb7p. Hi\u1ec3u c\u00e1ch ho\u1ea1t \u0111\u1ed9ng c\u1ee7a Call Stack l\u00e0 \u0111i\u1ec1u c\u1ea7n thi\u1ebft khi g\u1ee1 l\u1ed7i code \u0111\u1ec7 quy.<\/li>\n<li><strong>Nguy c\u01a1 t\u00ednh to\u00e1n d\u01b0 th\u1eeba:<\/strong> C\u00e1c gi\u1ea3i thu\u1eadt \u0111\u1ec7 quy \u0111\u01b0\u1ee3c thi\u1ebft k\u1ebf kh\u00f4ng c\u1ea9n th\u1eadn (nh\u01b0 v\u00ed d\u1ee5 Fibonacci c\u01a1 b\u1ea3n) c\u00f3 th\u1ec3 d\u1eabn \u0111\u1ebfn vi\u1ec7c t\u00ednh to\u00e1n l\u1ea1i c\u00f9ng m\u1ed9t gi\u00e1 tr\u1ecb nhi\u1ec1u l\u1ea7n, g\u00e2y l\u00e3ng ph\u00ed t\u00e0i nguy\u00ean nghi\u00eam tr\u1ecdng.<\/li>\n<\/ol>\n<p>T\u00f3m l\u1ea1i, \u0111\u1ec7 quy l\u00e0 m\u1ed9t c\u00f4ng c\u1ee5 m\u1ea1nh m\u1ebd v\u00e0 thanh l\u1ecbch, nh\u01b0ng c\u1ea7n \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng m\u1ed9t c\u00e1ch c\u00e2n nh\u1eafc, \u0111\u1eb7c bi\u1ec7t ch\u00fa \u00fd \u0111\u1ebfn c\u00e1c y\u1ebfu t\u1ed1 v\u1ec1 b\u1ed9 nh\u1edb v\u00e0 hi\u1ec7u su\u1ea5t.<\/p>\n<div style=\"background-color: #e6f2ff; border-radius: 10px; padding: 20px; margin: 20px 0; border: 1px solid #b3d9ff;\">\n<p><strong>C\u00d3 TH\u1ec2 B\u1ea0N QUAN T\u00c2M<\/strong><\/p>\n<p>Khi c\u1ea7n m\u00f4i tr\u01b0\u1eddng \u1ed5n \u0111\u1ecbnh \u0111\u1ec3 th\u1ef1c h\u00e0nh, ki\u1ec3m th\u1eed hi\u1ec7u n\u0103ng thu\u1eadt to\u00e1n nh\u01b0 \u0111\u1ec7 quy, hay tri\u1ec3n khai \u1ee9ng d\u1ee5ng, b\u1ea1n c\u00f3 th\u1ec3 tham kh\u1ea3o <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/interdata.vn\/thue-vps\/\"><strong>d\u1ecbch v\u1ee5 thu\u00ea VPS gi\u00e1 r\u1ebb &#8211; uy t\u00edn &#8211; t\u1ed1c \u0111\u1ed9 cao<\/strong><\/a> t\u1ea1i InterData. Ch\u1ec9 t\u1eeb 3K\/ng\u00e0y, tr\u1ea3i nghi\u1ec7m c\u1ea5u h\u00ecnh m\u1ea1nh m\u1ebd v\u1edbi ph\u1ea7n c\u1ee9ng chuy\u00ean d\u1ee5ng AMD EPYC Gen 3, SSD NVMe U.2, b\u0103ng th\u00f4ng cao cho t\u1ed1c \u0111\u1ed9 v\u00e0 s\u1ef1 \u1ed5n \u0111\u1ecbnh v\u01b0\u1ee3t tr\u1ed9i.<\/p>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"Khi-nao-nen-va-khong-nen-dung-De-quy\"><\/span>Khi n\u00e0o n\u00ean v\u00e0 kh\u00f4ng n\u00ean d\u00f9ng \u0110\u1ec7 quy?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Sau khi \u0111\u00e3 t\u00ecm hi\u1ec3u v\u1ec1 c\u00e1ch ho\u1ea1t \u0111\u1ed9ng, \u01b0u v\u00e0 nh\u01b0\u1ee3c \u0111i\u1ec3m, c\u00e2u h\u1ecfi th\u1ef1c t\u1ebf \u0111\u1eb7t ra l\u00e0: &#8220;Khi n\u00e0o t\u00f4i n\u00ean ch\u1ecdn \u0111\u1ec7 quy, v\u00e0 khi n\u00e0o n\u00ean ch\u1ecdn v\u00f2ng l\u1eb7p?&#8221;. Kh\u00f4ng c\u00f3 c\u00e2u tr\u1ea3 l\u1eddi tuy\u1ec7t \u0111\u1ed1i, nh\u01b0ng \u0111\u00e2y l\u00e0 m\u1ed9t s\u1ed1 h\u01b0\u1edbng d\u1eabn d\u1ef1a tr\u00ean kinh nghi\u1ec7m v\u00e0 c\u00e1c y\u1ebfu t\u1ed1 \u0111\u00e3 ph\u00e2n t\u00edch.<\/p>\n<p><strong>N\u00ean c\u00e2n nh\u1eafc s\u1eed d\u1ee5ng \u0110\u1ec7 quy khi:<\/strong><\/p>\n<ol>\n<li><strong>B\u00e0i to\u00e1n c\u00f3 b\u1ea3n ch\u1ea5t \u0111\u1ec7 quy t\u1ef1 nhi\u00ean:<\/strong> \u0110\u00e2y l\u00e0 tr\u01b0\u1eddng h\u1ee3p l\u00fd t\u01b0\u1edfng nh\u1ea5t. C\u00e1c c\u1ea5u tr\u00fac d\u1eef li\u1ec7u nh\u01b0 c\u00e2y (duy\u1ec7t c\u00e2y), \u0111\u1ed3 th\u1ecb (t\u00ecm ki\u1ebfm theo chi\u1ec1u s\u00e2u &#8211; DFS), ho\u1eb7c c\u00e1c b\u00e0i to\u00e1n c\u00f3 th\u1ec3 \u0111\u1ecbnh ngh\u0129a d\u1ef1a tr\u00ean ch\u00ednh n\u00f3 (Giai th\u1eeba, Fibonacci &#8211; d\u00f9 c\u1ea7n t\u1ed1i \u01b0u) th\u01b0\u1eddng c\u00f3 l\u1eddi gi\u1ea3i \u0111\u1ec7 quy r\u1ea5t t\u1ef1 nhi\u00ean v\u00e0 d\u1ec5 hi\u1ec3u.<\/li>\n<li><strong>\u00c1p d\u1ee5ng c\u00e1c gi\u1ea3i thu\u1eadt Chia \u0111\u1ec3 tr\u1ecb (Divide and Conquer):<\/strong> C\u00e1c thu\u1eadt to\u00e1n kinh \u0111i\u1ec3n nh\u01b0 Mergesort, Quicksort, t\u00ecm ki\u1ebfm nh\u1ecb ph\u00e2n (Binary Search) v\u1ed1n d\u1ef1a tr\u00ean vi\u1ec7c chia b\u00e0i to\u00e1n th\u00e0nh c\u00e1c b\u00e0i to\u00e1n con gi\u1ed1ng h\u1ec7t nh\u01b0ng nh\u1ecf h\u01a1n, r\u1ea5t ph\u00f9 h\u1ee3p v\u1edbi c\u00e1ch ti\u1ebfp c\u1eadn \u0111\u1ec7 quy.<\/li>\n<li><strong>\u01afu ti\u00ean s\u1ef1 r\u00f5 r\u00e0ng v\u00e0 ng\u1eafn g\u1ecdn c\u1ee7a code:<\/strong> N\u1ebfu m\u1ed9t gi\u1ea3i ph\u00e1p \u0111\u1ec7 quy gi\u00fap m\u00e3 ngu\u1ed3n tr\u1edf n\u00ean s\u00e1ng s\u1ee7a, d\u1ec5 \u0111\u1ecdc h\u01a1n \u0111\u00e1ng k\u1ec3 so v\u1edbi gi\u1ea3i ph\u00e1p v\u00f2ng l\u1eb7p ph\u1ee9c t\u1ea1p, v\u00e0 c\u00e1c y\u1ebfu t\u1ed1 v\u1ec1 hi\u1ec7u su\u1ea5t, b\u1ed9 nh\u1edb kh\u00f4ng qu\u00e1 kh\u1eaft khe, th\u00ec \u0111\u1ec7 quy l\u00e0 m\u1ed9t l\u1ef1a ch\u1ecdn t\u1ed1t.<\/li>\n<\/ol>\n<p><strong>N\u00ean tr\u00e1nh ho\u1eb7c c\u1ea9n tr\u1ecdng khi s\u1eed d\u1ee5ng \u0110\u1ec7 quy khi:<\/strong><\/p>\n<ol>\n<li><strong>Y\u00eau c\u1ea7u hi\u1ec7u su\u1ea5t t\u1ed1i \u0111a:<\/strong> N\u1ebfu \u1ee9ng d\u1ee5ng \u0111\u00f2i h\u1ecfi t\u1ed1c \u0111\u1ed9 x\u1eed l\u00fd cao nh\u1ea5t c\u00f3 th\u1ec3, v\u00e0 c\u00f3 m\u1ed9t gi\u1ea3i ph\u00e1p v\u00f2ng l\u1eb7p hi\u1ec7u qu\u1ea3 t\u01b0\u01a1ng \u0111\u01b0\u01a1ng ho\u1eb7c h\u01a1n, th\u00ec n\u00ean \u01b0u ti\u00ean v\u00f2ng l\u1eb7p \u0111\u1ec3 tr\u00e1nh overhead c\u1ee7a c\u00e1c l\u1eddi g\u1ecdi h\u00e0m.<\/li>\n<li><strong>\u0110\u1ed9 s\u00e2u \u0111\u1ec7 quy c\u00f3 th\u1ec3 r\u1ea5t l\u1edbn:<\/strong> N\u1ebfu b\u1ea1n d\u1ef1 \u0111o\u00e1n r\u1eb1ng s\u1ed1 l\u1ea7n h\u00e0m t\u1ef1 g\u1ecdi l\u1ea1i ch\u00ednh n\u00f3 c\u00f3 th\u1ec3 l\u00ean t\u1edbi h\u00e0ng ngh\u00ecn, h\u00e0ng tri\u1ec7u l\u1ea7n (v\u00ed d\u1ee5: x\u1eed l\u00fd m\u1ed9t danh s\u00e1ch r\u1ea5t d\u00e0i m\u1ed9t c\u00e1ch tuy\u1ebfn t\u00ednh), nguy c\u01a1 Stack Overflow l\u00e0 r\u1ea5t cao. L\u00fac n\u00e0y, v\u00f2ng l\u1eb7p l\u00e0 l\u1ef1a ch\u1ecdn an to\u00e0n h\u01a1n nhi\u1ec1u.<\/li>\n<li><strong>B\u00e0i to\u00e1n c\u00f3 th\u1ec3 gi\u1ea3i quy\u1ebft \u0111\u01a1n gi\u1ea3n b\u1eb1ng v\u00f2ng l\u1eb7p:<\/strong> \u0110\u1eebng c\u1ed1 g\u1eafng \u00e9p bu\u1ed9c s\u1eed d\u1ee5ng \u0111\u1ec7 quy cho nh\u1eefng t\u00e1c v\u1ee5 l\u1eb7p \u0111\u01a1n gi\u1ea3n m\u00e0 m\u1ed9t v\u00f2ng <code>for<\/code> hay <code>while<\/code> th\u00f4ng th\u01b0\u1eddng c\u00f3 th\u1ec3 x\u1eed l\u00fd m\u1ed9t c\u00e1ch g\u1ecdn g\u00e0ng v\u00e0 hi\u1ec7u qu\u1ea3. H\u00e3y ch\u1ecdn c\u00f4ng c\u1ee5 ph\u00f9 h\u1ee3p nh\u1ea5t v\u00e0 \u0111\u01a1n gi\u1ea3n nh\u1ea5t.<\/li>\n<\/ol>\n<p>Cu\u1ed1i c\u00f9ng, vi\u1ec7c l\u1ef1a ch\u1ecdn gi\u1eefa \u0111\u1ec7 quy v\u00e0 v\u00f2ng l\u1eb7p l\u00e0 m\u1ed9t s\u1ef1 c\u00e2n nh\u1eafc gi\u1eefa s\u1ef1 thanh l\u1ecbch, r\u00f5 r\u00e0ng c\u1ee7a code v\u00e0 c\u00e1c y\u1ebfu t\u1ed1 th\u1ef1c t\u1ebf v\u1ec1 hi\u1ec7u su\u1ea5t, b\u1ed9 nh\u1edb. Kinh nghi\u1ec7m th\u1ef1c t\u1ebf s\u1ebd gi\u00fap b\u1ea1n \u0111\u01b0a ra quy\u1ebft \u0111\u1ecbnh t\u1ed1t h\u01a1n trong t\u1eebng t\u00ecnh hu\u1ed1ng c\u1ee5 th\u1ec3.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Cau-hoi-thuong-gap-ve-De-quy-FAQ\"><\/span>C\u00e2u h\u1ecfi th\u01b0\u1eddng g\u1eb7p v\u1ec1 \u0110\u1ec7 quy (FAQ)<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>D\u01b0\u1edbi \u0111\u00e2y l\u00e0 m\u1ed9t s\u1ed1 c\u00e2u h\u1ecfi ph\u1ed5 bi\u1ebfn m\u00e0 nh\u1eefng ng\u01b0\u1eddi m\u1edbi h\u1ecdc l\u1eadp tr\u00ecnh th\u01b0\u1eddng g\u1eb7p khi t\u00ecm hi\u1ec3u v\u1ec1 \u0111\u1ec7 quy:<\/p>\n<h3><span class=\"ez-toc-section\" id=\"De-quy-co-kho-hoc-khong\"><\/span>\u0110\u1ec7 quy c\u00f3 kh\u00f3 h\u1ecdc kh\u00f4ng?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0110\u1ec7 quy c\u00f3 th\u1ec3 h\u01a1i kh\u00f3 n\u1eafm b\u1eaft ban \u0111\u1ea7u v\u00ec n\u00f3 \u0111\u00f2i h\u1ecfi m\u1ed9t c\u00e1ch t\u01b0 duy kh\u00e1c bi\u1ec7t so v\u1edbi v\u00f2ng l\u1eb7p tu\u1ea7n t\u1ef1. Kh\u00e1i ni\u1ec7m m\u1ed9t h\u00e0m t\u1ef1 g\u1ecdi l\u1ea1i ch\u00ednh n\u00f3 c\u00f3 v\u1ebb h\u01a1i l\u1ea1. Tuy nhi\u00ean, ch\u00eca kh\u00f3a n\u1eb1m \u1edf vi\u1ec7c hi\u1ec3u r\u00f5 hai th\u00e0nh ph\u1ea7n: <strong>Tr\u01b0\u1eddng h\u1ee3p c\u01a1 s\u1edf (Base Case)<\/strong> v\u00e0 <strong>B\u01b0\u1edbc \u0111\u1ec7 quy (Recursive Step)<\/strong>, c\u00f9ng v\u1edbi c\u00e1ch <strong>Call Stack<\/strong> ho\u1ea1t \u0111\u1ed9ng. B\u1eaft \u0111\u1ea7u v\u1edbi c\u00e1c v\u00ed d\u1ee5 \u0111\u01a1n gi\u1ea3n nh\u01b0 giai th\u1eeba, Fibonacci v\u00e0 th\u1ef1c h\u00e0nh nhi\u1ec1u s\u1ebd gi\u00fap b\u1ea1n quen d\u1ea7n v\u00e0 th\u1ea5y n\u00f3 tr\u1edf n\u00ean d\u1ec5 d\u00e0ng h\u01a1n.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Lam-the-nao-de-tranh-loi-Stack-Overflow\"><\/span>L\u00e0m th\u1ebf n\u00e0o \u0111\u1ec3 tr\u00e1nh l\u1ed7i Stack Overflow?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>C\u00e1ch quan tr\u1ecdng nh\u1ea5t l\u00e0 \u0111\u1ea3m b\u1ea3o h\u00e0m \u0111\u1ec7 quy c\u1ee7a b\u1ea1n <i>lu\u00f4n lu\u00f4n<\/i> c\u00f3 m\u1ed9t ho\u1eb7c nhi\u1ec1u <strong>Tr\u01b0\u1eddng h\u1ee3p c\u01a1 s\u1edf (Base Case)<\/strong> \u0111\u01b0\u1ee3c \u0111\u1ecbnh ngh\u0129a ch\u00ednh x\u00e1c v\u00e0 <i>lu\u00f4n lu\u00f4n<\/i> c\u00f3 th\u1ec3 \u0111\u1ea1t \u0111\u01b0\u1ee3c sau m\u1ed9t s\u1ed1 h\u1eefu h\u1ea1n c\u00e1c b\u01b0\u1edbc \u0111\u1ec7 quy. H\u00e3y ki\u1ec3m tra k\u1ef9 logic \u0111\u1ec3 ch\u1eafc ch\u1eafn r\u1eb1ng <strong>B\u01b0\u1edbc \u0111\u1ec7 quy (Recursive Step)<\/strong> th\u1ef1c s\u1ef1 l\u00e0m cho \u0111\u1ea7u v\u00e0o ti\u1ebfn g\u1ea7n \u0111\u1ebfn Base Case.<\/p>\n<p>N\u1ebfu b\u00e0i to\u00e1n \u0111\u00f2i h\u1ecfi \u0111\u1ed9 s\u00e2u \u0111\u1ec7 quy qu\u00e1 l\u1edbn m\u00e0 b\u1ea1n kh\u00f4ng th\u1ec3 tr\u00e1nh \u0111\u01b0\u1ee3c, h\u00e3y c\u00e2n nh\u1eafc chuy\u1ec3n \u0111\u1ed5i thu\u1eadt to\u00e1n sang d\u1ea1ng <strong>v\u00f2ng l\u1eb7p (iteration)<\/strong>. \u0110\u00f4i khi, vi\u1ec7c s\u1eed d\u1ee5ng m\u1ed9t c\u1ea5u tr\u00fac d\u1eef li\u1ec7u stack t\u01b0\u1eddng minh trong code v\u00f2ng l\u1eb7p c\u00f3 th\u1ec3 m\u00f4 ph\u1ecfng l\u1ea1i h\u00e0nh vi c\u1ee7a \u0111\u1ec7 quy m\u00e0 kh\u00f4ng b\u1ecb gi\u1edbi h\u1ea1n b\u1edfi Call Stack c\u1ee7a h\u1ec7 th\u1ed1ng.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"De-quy-duoi-Tail-Recursion-la-gi\"><\/span>\u0110\u1ec7 quy \u0111u\u00f4i (Tail Recursion) l\u00e0 g\u00ec?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><strong>\u0110\u1ec7 quy \u0111u\u00f4i (Tail Recursion)<\/strong> l\u00e0 m\u1ed9t tr\u01b0\u1eddng h\u1ee3p \u0111\u1eb7c bi\u1ec7t c\u1ee7a \u0111\u1ec7 quy, x\u1ea3y ra khi l\u1eddi g\u1ecdi \u0111\u1ec7 quy l\u00e0 h\u00e0nh \u0111\u1ed9ng <i>cu\u1ed1i c\u00f9ng<\/i> \u0111\u01b0\u1ee3c th\u1ef1c hi\u1ec7n trong h\u00e0m. Ngh\u0129a l\u00e0, sau khi l\u1eddi g\u1ecdi \u0111\u1ec7 quy tr\u1ea3 v\u1ec1 k\u1ebft qu\u1ea3, h\u00e0m m\u1eb9 kh\u00f4ng c\u1ea7n th\u1ef1c hi\u1ec7n th\u00eam b\u1ea5t k\u1ef3 ph\u00e9p t\u00ednh n\u00e0o kh\u00e1c m\u00e0 ch\u1ec9 c\u1ea7n tr\u1ea3 v\u1ec1 tr\u1ef1c ti\u1ebfp k\u1ebft qu\u1ea3 \u0111\u00f3.<\/p>\n<p>\u0110i\u1ec3m \u0111\u1eb7c bi\u1ec7t c\u1ee7a \u0111\u1ec7 quy \u0111u\u00f4i l\u00e0 n\u00f3 c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c t\u1ed1i \u01b0u h\u00f3a b\u1edfi m\u1ed9t s\u1ed1 tr\u00ecnh bi\u00ean d\u1ecbch ho\u1eb7c <a href=\"https:\/\/interdata.vn\/blog\/trinh-thong-dich-interpreter-la-gi\/\">tr\u00ecnh th\u00f4ng d\u1ecbch<\/a> th\u00f4ng qua k\u1ef9 thu\u1eadt g\u1ecdi l\u00e0 <strong>T\u1ed1i \u01b0u h\u00f3a \u0110\u1ec7 quy \u0110u\u00f4i (Tail Call Optimization &#8211; TCO)<\/strong>. TCO cho ph\u00e9p t\u00e1i s\u1eed d\u1ee5ng khung ng\u0103n x\u1ebfp (stack frame) hi\u1ec7n t\u1ea1i cho l\u1eddi g\u1ecdi \u0111\u1ec7 quy ti\u1ebfp theo, thay v\u00ec t\u1ea1o m\u1ed9t khung m\u1edbi.<\/p>\n<p>\u0110i\u1ec1u n\u00e0y gi\u00fap ng\u0103n ch\u1eb7n vi\u1ec7c Call Stack b\u1ecb \u0111\u1ea7y l\u00ean, lo\u1ea1i b\u1ecf nguy c\u01a1 Stack Overflow v\u00e0 l\u00e0m cho \u0111\u1ec7 quy \u0111u\u00f4i hi\u1ec7u qu\u1ea3 v\u1ec1 b\u1ed9 nh\u1edb t\u01b0\u01a1ng t\u1ef1 nh\u01b0 v\u00f2ng l\u1eb7p. Tuy nhi\u00ean, kh\u00f4ng ph\u1ea3i t\u1ea5t c\u1ea3 c\u00e1c ng\u00f4n ng\u1eef ho\u1eb7c m\u00f4i tr\u01b0\u1eddng \u0111\u1ec1u h\u1ed7 tr\u1ee3 TCO (v\u00ed d\u1ee5: CPython &#8211; tr\u00ecnh th\u00f4ng d\u1ecbch Python ph\u1ed5 bi\u1ebfn nh\u1ea5t &#8211; kh\u00f4ng h\u1ed7 tr\u1ee3 TCO).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Trong l\u1eadp tr\u00ecnh, ch\u00fang ta th\u01b0\u1eddng xuy\u00ean \u0111\u1ed1i m\u1eb7t v\u1edbi nh\u1eefng b\u00e0i to\u00e1n ph\u1ee9c t\u1ea1p. \u0110\u1ec3 gi\u1ea3i quy\u1ebft ch\u00fang, c\u00e1c l\u1eadp tr\u00ecnh vi\u00ean \u0111\u00e3 ph\u00e1t tri\u1ec3n nhi\u1ec1u k\u1ef9 thu\u1eadt v\u00e0 ph\u01b0\u01a1ng ph\u00e1p kh\u00e1c nhau. M\u1ed9t trong nh\u1eefng kh\u00e1i ni\u1ec7m n\u1ec1n t\u1ea3ng v\u00e0 m\u1ea1nh m\u1ebd, nh\u01b0ng \u0111\u00f4i khi c\u0169ng kh\u00e1 &#8220;hack n\u00e3o&#8221; cho ng\u01b0\u1eddi m\u1edbi, ch\u00ednh<\/p>\n","protected":false},"author":2,"featured_media":27526,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[140],"tags":[],"class_list":["post-27523","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-lap-trinh"],"_links":{"self":[{"href":"https:\/\/interdata.vn\/blog\/wp-json\/wp\/v2\/posts\/27523","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/interdata.vn\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/interdata.vn\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/interdata.vn\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/interdata.vn\/blog\/wp-json\/wp\/v2\/comments?post=27523"}],"version-history":[{"count":1,"href":"https:\/\/interdata.vn\/blog\/wp-json\/wp\/v2\/posts\/27523\/revisions"}],"predecessor-version":[{"id":27527,"href":"https:\/\/interdata.vn\/blog\/wp-json\/wp\/v2\/posts\/27523\/revisions\/27527"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/interdata.vn\/blog\/wp-json\/wp\/v2\/media\/27526"}],"wp:attachment":[{"href":"https:\/\/interdata.vn\/blog\/wp-json\/wp\/v2\/media?parent=27523"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/interdata.vn\/blog\/wp-json\/wp\/v2\/categories?post=27523"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/interdata.vn\/blog\/wp-json\/wp\/v2\/tags?post=27523"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}