tek4

Đệ quy trong JavaScript

by - September. 26, 2021
Học
Kiến thức
<p style="text-align: justify;">Trong b&agrave;i viết n&agrave;y, ta sẽ c&ugrave;ng t&igrave;m hiểu về đệ quy trong JavaScript c&ugrave;ng với sự trợ gi&uacute;p của c&aacute;c v&iacute; dụ dẫn chứng.</p> <h1>Đệ quy trong JavaScript</h1> <p style="text-align: justify;">Đệ quy l&agrave; một qu&aacute; tr&igrave;nh m&agrave; trong đ&oacute; một đối tượng sẽ tự thực hiện lời gọi ch&iacute;nh n&oacute;. Một h&agrave;m tự gọi ch&iacute;nh n&oacute; được gọi l&agrave; một h&agrave;m đệ quy.</p> <p><em>C&uacute; ph&aacute;p cho h&agrave;m đệ quy như sau:</em></p> <pre class="language-javascript"><code>function t&ecirc;n_h&agrave;m() { t&ecirc;n_h&agrave;m(); } t&ecirc;n_h&agrave;m();</code></pre> <p style="text-align: justify;">Một h&agrave;m đệ quy phải chứa một điều kiện để dừng thực hiện lời gọi cho ch&iacute;nh n&oacute;. Nếu kh&ocirc;ng, h&agrave;m sẽ tự gọi ch&iacute;nh n&oacute; v&ocirc; hạn. Khi điều kiện được đ&aacute;p ứng, h&agrave;m sẽ dừng lời gọi. Đ&acirc;y được gọi l&agrave; điều kiện cơ bản.</p> <p style="text-align: justify;">Để ngăn chặn h&agrave;m đệ quy v&ocirc; hạn, ta c&oacute; thể sử dụng c&acirc;u lệnh if...else (hoặc c&aacute;ch tiếp cận tương tự), trong đ&oacute; một nh&aacute;nh thực hiện lời gọi đệ quy v&agrave; nh&aacute;nh c&ograve;n lại sẽ được sử dụng để dừng h&agrave;m đệ quy.</p> <p style="text-align: justify;">V&iacute; dụ: Giả m&atilde; về việc thực hiện dừng h&agrave;m đệ quy.</p> <pre class="language-javascript"><code>function t&ecirc;n_h&agrave;m() { if(Điều kiện) { t&ecirc;n_h&agrave;m(); } else { // Ngừng lời gọi } } t&ecirc;n_h&agrave;m();</code></pre> <p>V&iacute; dụ 2: In ra gi&aacute; trị của 10 số tự nhi&ecirc;n đầu ti&ecirc;n.</p> <pre class="language-javascript"><code>function countDown(a) { if (a &gt; 0) { console.log(a); countDown(a - 1); } } countDown(10); console.log("Ch&uacute;c mừng năm mới!");</code></pre> <p>Kết quả:</p> <pre class="language-javascript"><code>10 9 8 7 6 5 4 3 2 1 Ch&uacute;c mừng năm mới!</code></pre> <p style="text-align: justify;">Trong chương tr&igrave;nh tr&ecirc;n, người d&ugrave;ng sẽ truyền một số l&agrave;m đối số khi gọi h&agrave;m. Trong mỗi lần lặp, gi&aacute; trị của đối số sẽ giảm đi 1 v&agrave; h&agrave;m countDown() được gọi cho đến khi đối số &lt; 0. Ở đ&acirc;y, a &gt; 0 l&agrave; điều kiện cơ bản.</p> <p style="text-align: justify;">V&iacute; dụ 2: T&iacute;nh tổng của 10 số tự nhi&ecirc;n đầu ti&ecirc;n.</p> <pre class="language-javascript"><code>var tong_so = 0; function sum(a) { if (a &gt; 0) { tong_so += a; sum(a - 1); } } sum(10); console.log(tong_so);</code></pre> <p>Kết quả:</p> <pre class="language-javascript"><code>55</code></pre> <p style="text-align: justify;">Trong chương tr&igrave;nh tr&ecirc;n, ta sẽ thực hiện việc t&iacute;nh tổng của 10 số tự nhi&ecirc;n đầu ti&ecirc;n bằng đệ quy. Ta thực hiện truyền đối số 10 v&agrave;o trong h&agrave;m v&agrave; thực hiện ph&eacute;p cộng t&iacute;nh tổng. Chừng n&agrave;o đối số c&ograve;n lớn hơn 0 th&igrave; ta sẽ vẫn thực hiện ph&eacute;p cộng v&agrave; giảm đối số đi 1 đơn vị sau mỗi lời gọi đệ quy. Do đ&oacute;, khi đối số = 0 th&igrave; lời gọi h&agrave;m đệ quy sẽ được dừng lại.</p> <p style="text-align: justify;">Như vậy, ta c&oacute; thể thấy rằng h&agrave;m đệ quy kh&aacute; giống với việc sử dụng v&ograve;ng lặp for hoặc c&aacute;c v&ograve;ng lặp kh&aacute;c trong chương tr&igrave;nh. Như trong v&iacute; dụ b&ecirc;n tr&ecirc;n, thay v&igrave; việc thực hiện h&agrave;m đệ quy, ta c&oacute; thể sử dụng v&ograve;ng lặp for như sau.</p> <p style="text-align: justify;">V&iacute; dụ: Sử dụng v&ograve;ng lặp for thay thế thực hiện h&agrave;m đệ quy.</p> <pre class="language-javascript"><code>var tong_so = 0; for(let i = 1; i &lt;= 10; i++){ tong_so += i; } console.log(tong_so)</code></pre> <p>Kết quả:</p> <pre class="language-javascript"><code>55</code></pre> <p style="text-align: justify;">Như vậy, ta vẫn ho&agrave;n to&agrave;n c&oacute; thể sử dụng v&ograve;ng lặp thay cho h&agrave;m đệ quy. Tuy nhi&ecirc;n, trong một số trường hợp, h&agrave;m đệ quy vẫn c&oacute; ưu thế tốt hơn so với v&ograve;ng lặp. Do đ&oacute;, c&aacute;c bạn h&atilde;y cố gắng chọn phương ph&aacute;p ph&ugrave; hợp nhất với m&igrave;nh nh&eacute;! Kh&ocirc;ng c&oacute; g&igrave; l&agrave; ho&agrave;n hảo cả, chỉ sự ph&ugrave; hợp!</p> <p style="text-align: justify;">Tr&ecirc;n đ&acirc;y l&agrave; kh&aacute;i niệm v&agrave; v&iacute; dụ cơ bản về đệ quy trong JavaScript. Hy vọng mọi người c&oacute; thể &aacute;p dụng v&agrave;o trong chương tr&igrave;nh của m&igrave;nh. Mọi người h&atilde;y tiếp tục theo d&otilde;i c&aacute;c b&agrave;i tiếp theo v&agrave; cập nhật c&aacute;c b&agrave;i tiếp theo về lập tr&igrave;nh JavaScript tr&ecirc;n <a href="http://tek4.vn">tek4</a> nh&eacute;!</p> <p style="text-align: justify;">P/s: Cảm ơn mọi người đ&atilde; tin tưởng tek4!</p>