- Tham gia
- 13/6/06
- Bài viết
- 4,771
- Được thích
- 10,281
- Giới tính
- Nam
- Nghề nghiệp
- Giáo viên, CEO tại Bluesofts
Thuật toán đệ quy đã có nhiều sách vở nói đến, có thể dễ dàng google là ra rất nhiều. Trên GPE cũng có thể nhiều bạn chưa biết hay đã biết. Tôi xin đưa ra để mọi người hiểu và cùng thảo luận thêm.
Có nhiều khái niệm về Đệ quy. Tôi xin nói theo cách hiểu của mình như thế này. Đệ quy là việc chạy lại một hàm hay thủ tục trong chính nó.
Ví dụ: Tinh giai thừa của một số bất kỳ
Cách dùng vòng lặp
GiaiThua2 = GiaiThua2 * I. GiaiThua2 trong dòng lệnh này đóng vai trò như một biến .
Dùng Đệ quy
GiaiThua = SoNguyen * GiaiThua(SoNguyen - 1). GiaiThua(SoNguyen - 1) được gọi lại với một tham số mới. Đây chính là thuật Đệ quy!
Ví dụ 2: Nhập số. Yếu cầu nhập số, nếu nhập sai thì nhập lại.
Dùng vòng lặp
Dùng Đệ quy
Mình đang viết dở thì bận rồi, xin viết tiếp bài sau.
Có nhiều khái niệm về Đệ quy. Tôi xin nói theo cách hiểu của mình như thế này. Đệ quy là việc chạy lại một hàm hay thủ tục trong chính nó.
Ví dụ: Tinh giai thừa của một số bất kỳ
Cách dùng vòng lặp
Mã:
Function GiaiThua2(ByVal SoNguyen As Long) As Long
Dim I As Long
GiaiThua2 = 1
For I = SoNguyen To 1 Step -1
GiaiThua2 = GiaiThua2 * I
Next I
End Function
GiaiThua2 = GiaiThua2 * I. GiaiThua2 trong dòng lệnh này đóng vai trò như một biến .
Dùng Đệ quy
Mã:
Function [B]GiaiThua[/B](ByVal SoNguyen As Long) As Long
[COLOR="SeaGreen"] 'GiaiThua(5) = 5*4*3*2*1
'SoNguyen! = SoNguyen * (SoNguyen-1) * (SoNguyen-2)*...*1[/COLOR]
If SoNguyen = 1 Or SoNguyen = 0 Then
GiaiThua = 1
Else
GiaiThua = SoNguyen * [B]GiaiThua[/B](SoNguyen - 1)
End If
End Function
Ví dụ 2: Nhập số. Yếu cầu nhập số, nếu nhập sai thì nhập lại.
Dùng vòng lặp
Mã:
Sub NhanSo2()
Dim vSo As Variant
vSo = "ABC"
Do While True
If Not IsNumeric(vSo) Then
vSo = InputBox("Hay nhap mot so. Neu nhap sai chuong trinh yeu cau nhap lai!", "Nhan So")
Else
MsgBox "Ban da nhap dung!"
Exit Do
End If
Loop
End Sub
Dùng Đệ quy
Mã:
Sub [B]NhanSo[/B]()
Dim vSo As Variant
vSo = InputBox("Hay nhap mot so. Neu nhap sai chuong trinh yeu cau nhap lai!", "Nhan So")
If Not IsNumeric(vSo) Then
[B]NhanSo[/B]
Else
MsgBox "Ban da nhap dung!"
End If
End Sub
Mình đang viết dở thì bận rồi, xin viết tiếp bài sau.