SlideShare una empresa de Scribd logo
1 de 114
Descargar para leer sin conexión
Kỹ thuật lập trình
Giảng viên: Đỗ Tuấn Anh
Địa chỉ:
Bộ môn Khoa học Máy tính
323 C1 ĐHBK Hà Nội
Email:
anhdt@it-hut.edu.vn
Điện thoại: 0989095167
Mục tiêu
• Nắm bắt được các loại
ngôn ngữ lập trình
• Kỹ thuật lập trình đệ qui
• Tìm hiểu lập trình cấu
trúc
• Tìm hiểu lập trình hướng
đối tượng
• Tìm hiểu các thao tác vào
ra
Nội dung trình bày
• Chương 1: Mở đầu
– Giới thiệu về ngôn ngữ lập trình
– Ngôn ngữ lập trình C

•
•
•
•

Chương 2: Đệ qui
Chương 3: Lập trình cấu trúc
Chương 4: Lập trình hướng đối tượng
Chương 5: Thao tác vào ra với tệp tin
Tài liệu tham khảo
• [1] Data Structures and
Algorithm Analysis in C
– Mark Allen Weiss

• [2] Cấu trúc dữ liệu và giải
thuật
– Đỗ Auân Lôi

• [3] Ngôn ngữ lập trình C
– Nguyễn Thanh Thủy

• [4] Lập trình với các cấu
trúc dữ liệu trên Pascal
– Lê Minh Trung
Chương 1: Mở đầu
•

Giới thiệu ngôn ngữ lập trình
1. Lịch sử phát triển
2. Các mô hình ngôn ngữ lập trình
1. Lịch sử phát triển ngôn ngữ lập trình
• Ngôn ngữ máy
• Hợp ngữ (Assembly)
• Ngôn ngữ bậc cao
–
–
–
–

Fortran, Pascal, C, Java, …
Prolog
Lisp
Occam

• Ngôn ngữ truy vấn
– SQL
2. Phân loại
• Ngôn ngư lập trình được phân loại
theo phương thức lập trình
Phương thức lập trình

Mệnh lệnh

Thủ tục

Hướng đối
tượng

Khai báo

Aử lý
song song

Logic

Hàm

CSDL
2. Phân loại (tiếp)
• Mệnh lệnh
– Thủ tục: Fortran (1957), Pascal (1970),
C(1971), …
– Đối tượng: Smalltalk (1969), C++(1983),
Java(1991), C#(2000),…
– Song song: Ada, Occam(1982), C-Linda

• Khai báo
– Hàm: Lisp(1958), Caml(1987),
Miranda(1982)
– Logic: Prolog(1970)
– CSDL: SQL(1980)
2. Phân loại (tiếp)
• Đặc điểm của ngôn ngữ mệnh lệnh
–
–
–
–
–
–
–
–
–
–

Diễn đạt thuật toán sử dụng tập các trạng thái.
Aử lý lần lượt
Khai báo dữ liệu
Kiểu dữ liệu cơ bản, và kiểu dữ liệu mới
Hai kiểu dữ liệu có cùng tên thì tương đương
Thay đổi trạng thái thông qua lệnh gán
Cấu trúc điều khiển là tuần tự
Chương trình con: hàm, thủ tục với truyền tham số
Hiệu ứng phụ khi sử dụng chương trình con
Bốn mức: Khối, CT con, module, chương trình

• Đặc điểm của ngôn ngữ khai báo
– Sử dụng các hàm suy luận
– Đánh giá một biểu thức
2.1 Lập trình cấu trúc
• Chương trình được tổ chức theo các
công việc cần thực hiện, phân chia
chương trình theo chức năng.
• Đặc điểm
– Gồm các chương trình con
– Thực hiện tuần tự
– Các kiểu dữ liệu xây dựng dựa trên kiểu
dữ liệu cơ bản

• Ngôn ngữ
– C, Pascal, …
2.2 Lập trình hướng đối tượng
• Aây dựng dựa trên nền tảng khái niệm
lập trình có cấu trúc
• Phân chia bài toán thành các đối
tượng và bài toán đi giải quyết mối
quan hệ giữa các đối tượng
• Các khái niệm
– Class
• Method
• Properties

– Object
3. Ngôn ngữ lập trình C
• Trong môn học này dùng C để mô tả
các bài toán
• Yêu cầu:
– Nắm chắc ngôn ngữ C
– Cài đặt các bài toán cơ bản trên ngôn ngữ
C
– Bài tập: Viết một chương trình
• Đọc dữ liệu từ file văn bản VB.TAT
• Liệt kê các từ có trong văn bản và đếm xem
có bao nhiêu lần từ đó xuất hiện và xem nó
hiển thị ở trang bao nhiêu (mỗi trang 25
dòng)
Khái niệm
Software

Program 1

Commands

Program 2

Commands

Commands
Ngôn ngữ cấp trung
Ngôn ngữ cấp cao

C
Ngôn ngữ hợp ngữ
Đặc điểm của C
• C có 32 từ khóa
• Những từ khóa này kết hợp với cú
pháp của C hình thành ngôn ngữ C
• Các quy tắc được áp dụng cho các
chương trình C
Cấu trúc chương trình C
main()

• Chương trình C được chia nhỏ thành
những đơn vị gọi là hàm
• Không kể có bao nhiêu hàm trong
chương trình, Hệ điều hành luôn trao
quyền điều khiển cho hàm main() khi
một chương trình C được thực thi.
• Theo sau tên hàm là dấu ngoặc đơn
• Dấu ngoặc đơn có thể có chứa hay
không chứa những tham số
Cấu trúc chương trình C
• Dấu phân cách {…}
• Dấu kết thúc câu lệnh
…;
• /*Dòng chú thích*/
Biên dịch và thi hành chương trình
Biến
Bộ nhớ

Dữ liệu

15

15
Dữ liệu
trong bộ
nhớ

Mỗi vị trí trong bộ nhớ là duy nhất
Biến cho phép cung cấp một tên có ý nghĩa cho mỗi vị trí nhớ
Định danh
•
•

•

•
•

Tên của các biến (variables), các hàm (functions), các
nhãn (labels) và các đối tượng khác nhau do người dùng
định nghĩa gọi là định danh
Ví dụ về các định danh đúng
– arena
– s_count
– marks40
– class_one
Ví dụ về các định danh sai
– 1sttest
– oh!god
– start... end
Các định danh có thể có bất cứ chiều dài nào theo quy
ước, nhưng số ký tự trong một biến được nhận diện bởi
trình biên dịch thì thay đổi theo trình biên dịch
Các định danh trong C có phân biệt chữ hoa và chữ
thường
Các nguyên tắc đặt tên định danh
Tên biến phải bắt đầu bằng một ký tự alphabet
Theo sau ký tự đầu có thể là các ký tự chữ, số …
Nên tránh đặt tên biến trùng tên các từ khoá
Tên biến nên mô tả được ý nghĩa của nó
Tránh dùng các ký tự gây lầm lẫn
Nên áp dụng các quy ước đặt tên biến chuẩn khi
lập trình
Kiểu dữ liệu cơ bản
Kiểu dữ liệu cơ bản

int

float double char

void
Những kiểu dữ liệu dẫn xuất
Bộ bổ từ (Modifiers)
kiểu dữ liệu

Kiểu dữ liệu
cơ bản

unsigned

int

short

int

Kiểu dữ liệu dẫn xuất

unsigned int
(chỉ là số dương)

short int
(chiếm ít bộ nhớ hơn int)
Long int /longdouble

long

int/double

(chiếm nhiều bộ nhớ hơn
int/double)
Kiểu dữ liệu & phạm vi giá trị
Kiểu

Dung lượng
tính bằng bit

Phạm vi

char

8

-128 tới 127

Unsigned char

8

0 tới 255

signed char

8

-128 tới 127

int

16

-32,768 tới 32,767

unsigned int

16

0 tới 65,535

signed int

16

Giống như kiểu int

short int

16

Giống như kiểu int

unsigned short int

16

0 tới 65, 535
Biểu thức (Expressions)
Sự kết hợp các toán tử và các toán hạng
Toán Tử

Ví dụ:

2*y+5
Toán hạng
Toán tử gán
Toán tử gán (=) có thể được dùng với bất kỳ
biểu thức C hợp lệ nào

(Tên biến)

(Biểu thức)

(Giá trị phải)

(Giá trị trái)
(Toán tử gán)
Bốn Kiểu Toán Tử
Số học
(Arithmetic)

Logic
(Logical)

Quan hệ
(Relational)

Nhị phân
(Bitwise)
Vào ra trong C
#include <stdio.h>
• Đây là câu lệnh tiền xử lý

stdio.h là tập tin header (header file)
Chứa các macro sử dụng cho nhiều
hàm nhập/xuất trong C
Các macro trong stdio.h giúp các hàm
printf(), scanf(), putchar(), getchar()
thực thi
Các cấu trúc điều khiển
• Rẽ nhánh
– If
– switch

• Lặp
– For
– While
– Do …While
Lệnh IF

• if (expression)
statement;
else
statement;
Lệnh switch
Vòng lặp For
Cú pháp:

for (initialize counter; conditional test; re-evaluation parameter)
{
statement
}

initialize counter là một lệnh gán để khởi tạo biến điều
khiển của vòng lặp trước khi đi vào vòng lặp
conditional test là một biểu thức quan hệ để chỉ định
khi nào vòng lặp sẽ kết thúc
• re-evaluation parameter định nghĩa cách thức thay đổi
của biến điều khiển vòng lặp mỗi khi vòng lặp được
thực thi
Vòng lặp While
Cú pháp

while (condition is true)
statement ;
Vòng lặp while lặp lại các lệnh
trong khi một biểu thức điều kiện
mang giá trị True
Vòng lặp Do…While
• Cú pháp

do{
statement;
} while (condition);

Trong vòng lặp do while phần thân của vòng lặp
được thực thi trước khi biểu thức điều kiện được kiểm
tra
Khi điều kiện mang giá trị False, vòng lặp do while
sẽ được kết thúc, và điều khiển chuyển đến lệnh xuất
hiện ngay sau lệnh while
Mảng
• Danh sách các phần tử có kiểu giống
nhau
• Khai báo
– [Kiểu dữ liệu] [Tên mảng][số lượng phần
tử]
– Ví dụ:
• char a[10];
• a[5]
• a+5
Contrỏ
Chương II: Đệ qui
• 1. Mô tả đệ qui
• 2. Bài toán đệ qui
• 3. Khử đệ qui
1. Mô tả đệ qui
•
•
•
•
•

1.1 Khái niệm về đệ qui
1.2 Các loại đệ qui
1.3 Mô tả đệ qui các cấu trúc dữ liệu
1.4 Mô tả đệ qui các giải thuật
1.5 Các dạng đệ qui đơn giản thường
gặp
1.1 Khái niệm về đệ qui
• Mô tả mang tính đệ qui về một đối
tượng là mô tả theo cách phân tích đối
tượng thành nhiều thành phần mà
trong số các thành phần có thành phần
mang tính chất của chính đối tượng
được mô tả.
• Tức là mô tả đối tượng qua chính nó.
1.1 Khái niệm về đệ qui
• Mô tả đệ quy tập số tự nhiên N :
– Số 1 là số tự nhiên ( 1 - N).
– Số tự nhiên bằng số tự nhiên cộng 1.

• Mô tả đệ quy cấu trúc ds(list) kiểu T :
– Cấu trúc rỗng là một ds kiểu T.
– Ghép nối một thành phần kiểu T(nút kiểu
T ) với một ds kiểu T ta có một ds kiểu T.

• Mô tả đệ quy cây gia phả : Gia phả
của một người bao gồm người đó và
gia phả của cha và gia phả của mẹ.
1.1 Khái niệm về đệ qui
• Mô tả đệ quy thủ tục sắp tăng dãy
• a[m:n] ( dãy a[m], a[m+1], . . . , a[n] )
bằng phương pháp Sort_Merge (SM):
• SM (a[m:n]) ≡ Merge ( SM(a[m :
(n+m) div 2]) , SM (a[(n+m) div 2 +1
: n] )
– Với : SM (a[x : x]) là thao tác rỗng
(không làm gì cả ).
– Merge (a[x : y] , a[(y+1) : z]) là thủ tục
trộn 2 dãy tăng a [x : y] , a[(y+1) : z] để
được một dãy a[x : z] tăng.
1.1 Khái niệm về đệ qui
• Mô tả đệ qui hàm giai thừa
– 0!=1
– F(n)=n*F(n-1)

• Ưu điểm của phương pháp mô tả đệ
qui
– Mô tả tập lớn tác đối tượng chỉ qua một
vài mệnh đề
– Mô tả một bài toán lớn chỉ qua một số ít
thao tác
1.1 Khái niệm về đệ qui
• Mô tả đệ qui gồm hai phần
– Phần neo:trường hợp suy biến của đối
tượng
• Ví dụ: 1 là số tự nhiên, cấu trúc rỗng là ds
kiểu T, 0 ! = 1 , SM (a[x:x]) là thao tác rỗng.

– Phần quy nạp: mô tả đối tượng (giải
thuật) thông qua chính đối tượng (giải
thuật ) đó một cách trực tiếp hoặc gián
tiếp.
• Ví dụ:
n! = n * (n – 1) !
SM (a[m:n]) ≡ Merge (SM (a[m:( m+n) div 2] ,
SM (a[(m+n) div 2 +1 : n]) )
1.2 Các loại đệ qui
• Gồm hai loại
– Đệ qui trực tiếp
– Đệ qui gián tiếp
1.2 Các loại đệ qui
• Đệ quy trực tiếp là loại đệ quy mà
đối tượng được mô tả trực tiếp qua nó
– A mô tả qua A, B, C,...trong đó B, C, ...
không chứa A.

• Đệ quy gián tiếp là loại đệ quy mà
đối tượng được mô tả gián tiếp qua nó
– A mô tả qua A1 ,A2 ,..., An .Trong đó có
một Ai được mô tả qua A.
1.3 Mô tả đệ qui các cấu trúc dữ liệu
• Cấu trúc dữ liệu có tính đệ quy thường gồm một
số thành phần dữ liệu cùng kiểu được ghép nối
theo cùng một phương thức
• Ví dụ :
– Mô tả đệ quy cây nhi phân :Cây nhi phân kiểu T
• Hoặc là một cấu trúc rỗng (phần neo).
• Hoặc là một nút kiểu T (nút gốc) và 2 cây nhị phân kiểu T rời
nhau (cây con nhị phân phải, cây con nhị phân trái) kết hợp
với nhau .

– Mô tả đệ quy mảng nhiều chiều :
• Mảng một chiều là dãy có thứ tự các thành phần cùng kiểu .
• Mảng n chiều là mảng 1 chiều mà các thành phần có kiểu
mảng n-1 chiều .
1.4 Mô tả đệ qui các giải thuật
• Giải thuật đệ qui
– Giải thuật đệ quy là giải thuật có chứa thao tác gọi đến nó
– Đặc điểm: mô tả một dãy lớn các thao tác bằng một số ít các thao
tác trong đó có chứa thao tác gọi lại giải thuật (gọi đệ quy)
– Biểu diễn giải thuật đệ qui
• P
P[ S , P ]
• Điều kiện dừng

– Biểu diễn tổng quát
• P
if B then P[ S , P ]
• hoặc P
P[ S , if B then P ]

• Chương trình con đệ qui
– Hàm đệ qui
– Thủ tục đệ qui
1.4 Mô tả đệ qui các giải thuật
• Dãy các giai thừa : { n! } ? 1 ,1 , 2 , 6 , 24 , 120 . . .
– Ký hiệu FAC(n ) = n ! .
• FAC(0 ) = 1 ; ( 0 ! = 1 )
• FAC(n ) = n * FAC(n - 1 ) ; ( n ! = n * (n - 1 ) ! ) với n >= 1

• Giải thuật đệ quy tính FAC(n ) là :
– FAC(n )
– if (n = 0 ) then return 1 ;
– else return (n * FAC(n - 1 )) ;
1.4 Mô tả đệ qui các giải thuật
• Dãy số Fibonaci(FIBO) :{ FIBO (n) } ≡ 1 ,1 , 2 ,
3 , 5 , 8 , 13 , 21 , 34 , 55 , 89 , 144 , 233 , 377 , .
..
– FIBO(0 ) = FIBO (1 ) = 1 ;
– FIBO(n ) = FIBO (n - 1 ) + FIBO ( n - 2 ) ; với n > = 2

• Giải thuật đệ quy tính FIBO ( n ) là :
– FIBO(n)
– if ((n = 0 ) or ( n = 1 )) then return 1 ;
– else return ( FIBO (n - 1) + FIBO (n - 2)) ;
1.5 Các dạng đệ qui đơn giản thường gặp
• Đệ qui tuyến tính: là dạng đệ qui trực tiếp đơn giản
nhất có dạng
– P
{
– If (B) thực hiện S;
– else { thực hiện S* ; gọi P }
– }
Với S , S* là các thao tác không đệ quy .
Ví dụ:Hàm FAC(n) tính số hạng n của dãy n!
– Dạng hàm trong ngôn ngữ mã giả :
• { Nếu n = 0 thì FAC = 1 ; /* trường hợp neo*/

• Ngược lại FAC = n*FAC(n-1) }
– Dạng hàm trong C++ :
•
•
•
•

int FAC( int n )
{ if ( n == 0 ) return 1 ;
else return ( n * FAC(n-1 )) ;
}
1.5 Các dạng đệ qui đơn giản thường gặp
• Chương trình con tính USCLN của 2 số dựa
vào thuật toán Euclide
– Dạng hàm trên ngôn ngữ toán học
• USCLN(m , n ) = USCLN(n , m mod n ) khi n ≠ 0
• USCLN(m , 0) = m

– Dạng hàm trong C++ :
• int USCLN( int m , int n )
• { if(n == 0 ) return (m) ;
• else return ( USCLN( n , m mod n)) ; }
1.5 Các dạng đệ qui đơn giản thường gặp (tiếp)
• Đệ qui nhị phân: là đệ qui trực tiếp có dạng như
sau
– P
{
– If (B) thực hiện S;
– else { thực hiện S* ; gọi P ; gọi P}
– }
Với S , S* là các thao tác không đệ quy .
Ví dụ : Hàm FIBO(n) tính số hạng n của dãy
FIBONACCI
– Dạng hàm trong C++ :
• int F(int n)
• { if ( n < 2 ) return 1 ;
• else return (F(n -1) + F(n -2)) ; }
1.5 Các dạng đệ qui đơn giản thường gặp (tiếp)
• Đệ qui phi tuyến: là đệ quy trực tiếp mà lời gọi đệ
quy được thực hiện bên trong vòng lặp.
– P
{
– for (<giá tri đầu> to <giá trị cuối>)
– {thực hiện S ;
– if ( thỏa điều kiện dừng ) then thực hiện S*;
– else gọi P;}
– }
Với S , S* là các thao tác không đệ quy .
– Ví dụ: Cho dãy { An } xác định theo công thức truy
hồi :
A0 = 1 ; An = n2 A0 +(n-1)2 A1 + . . . + 22 An-2 + 12 An-1
1.5 Các dạng đệ qui đơn giản thường gặp (tiếp)
• Dạng hàm đệ quy tính An trên ngôn ngữ C++ là :
–
–
–
–
–
–
–

int A( int n ) {
if ( n == 0 ) return 1 ;
else {
int tg = 0 ;
for (int i = 0 ; i<n ; i++ ) tg = tg + sqr(n-i) *A(i);
return ( tg ) ;
}
2. Bài toán đệ qui
• 2.1 Tìm giải thuật đệ qui
• 2.2 Một số bài toán giải bằng đệ qui
2.1 Tìm giải thuật đệ qui
• Thực hiện 3 bước
– Thông số hóa bài toán .
– Tìm các trường hợp neo cùng giải thuật giải tương ứng
– Tìm giải thuật giải trong trường hợp tổng quát bằng
phân rã bài toán theo kiểu đệ quy.
2.1 Tìm giải thuật đệ qui
• Thông số hóa bài toán
– Tổng quát hóa bài toán cụ thể cần giải thành bài toán
tổng quát (một họ các bài toán chứa bài toán cần giải )
– Tìm ra các thông số cho bài toán tổng quát
• các thông số điều khiển: các thông số mà độ lớn của chúng
đặc trưng cho độ phức tạp của bài toán , và giảm đi qua mỗi
lần gọi đệ qui.

– Ví dụ
• n trong hàm FAC(n) ;
• a , b trong hàm USCLN(a,b) .
2.1 Tìm giải thuật đệ qui (tiếp)
• Phát hiện trường hợp suy biến
– trường hợp suy biến của bài toán tổng
quát
– các trường hợp tương ứng với các gía trị
biên của các biến điều khiển

• Ví dụ :
FAC(1) =1
USCLN(a,0) = a
SM(a[x:x]) ≡∅
TSUM(a[m:m]) = a[m]
2.1 Tìm giải thuật đệ qui (tiếp)
• Phân rã bài toán tổng quát theo phương thức đệ qui
– Tìm phương án (giải thuật ) giải bài toán trong trường
hợp tổng quát phân chia nó thành các thành phần
• giải thuật không đệ quy
• bài toán trên nhưng có kích thước nhỏ hơn.

• Ví dụ
– FAC(n) = n * FAC(n -1) .
– Tmax(a[1:n]) = max(Tmax(a[1:(n-1)]) , a[n] )
2.2 Một số bài toán giải bằng đệ qui
• Bài toán tháp Hà Nội
• Bài toán chia phần thưởng
• Bài toán hoán vị
2.2 Một số bài toán giải bằng đệ qui (tiếp)
• Bài toán tháp Hà Nội
– Truyền thuyết kể rằng : Một nhà toán học Pháp sang thăm Đông
Dương đến một ngôi chùa cổ ở Hà Nội thấy các vị sư đang
chuyển một chồng đĩa qúy gồm 64 đĩa với kích thước khác nhau
từ cột A sang cột C theo cách :
• Mỗi lần chỉ chuyển 1 đĩa .
• Khi chuyển có thể dùng cột trung gian B .
• Trong suốt qúa trình chuyển các chồng đĩa ở các cột luôn được xếp
đúng (đĩa có kích thước bé được đặt trên đĩa có kích thước lớn ) .

– Khi được hỏi các vị sư cho biết khi chuyển xong chồng đĩa thì đến
ngày tận thế !

• Phân tích
– Với chồng gồm n đĩa cần 2n- 1 lần chuyển
– Giả sử thời gian để chuyển 1 đỉa là t giây thì thời gian để chuyển
xong chồng 64 đĩa sẽ là :
– T = ( 264 -1) * t = 1.84 1019 t
– Với t = 1/100 s thì T = 5.8*109 năm = 5.8 tỷ năm .
Bài toán tháp Hà Nội
• Giải bài toán bằng đệ qui
– Thông số hóa bài toán
• Xét bài toán ở mức tổng quát nhất : chuyển n (n>=0) đĩa từ
cột A sang cột C lấy cột B làm trung gian .
• THN(n ,A ,B,C) -> với 64 đĩa gọi THN(64,A ,B,C)
• n sẽ là thông số quyết định bài toán – n là tham số điều khiển

– Trường hợp suy biến và cách giải
• Với n =1 : THN (1,A,B,C)
– Giải thuật giải bài toán THN (1,A,B,C) là thực hiện chỉ 1 thao
tác cơ bản : Chuyển 1 đĩa từ A sang C ( ký hiệu là Move (A ,
C) ) .

• THN(1,A,B,C) ≡ { Move( A, C ) } .
• THN(0, A,B,C) ≡ { φ }
Bài toán tháp Hà Nội
• Phân rã bài toán
– Ta có thể phần rã bài toán TH N (k,A,B,C) : chuyển k
đĩa từ cột A sang cột C lấy cột B làm trung gian thành
dãy tuần tự 3 công việc sau :
• Chuyển (k -1) đĩa từ cột A sang cột B lấy cột C làm trung gian
:
– THN (k -1,A,C,B) (bài toán THN với n = k-1,A= A , B = C , C
=B)

• Chuyển 1 đĩa từ cột A sang cột C : Move ( A, C ) (thao tác cơ
bản ).
• Chuyển (k - 1 ) đĩa từ cột B sang cột C lấy cột A làm trung
gian :
– THN( k -1,B,A,C) ( bài toán THN với n = k-1 , A = B , B = A ,
C=C).
Bài toán tháp Hà Nội
• Vậy giải thuật trong trường hợp tổng quát (n > 1)
là :
– THN(n,X,Y,Z) ≡ {
•
•
•
•

THN (n -1,X,Z,Y) ;
Move ( X, Z ) ;
THN (n -1,Y,X,Z) ;
}
Bài toán tháp Hà Nội
• Độ phức tạp của bài toán
– Với n đĩa , gọi f(n) là số các thao tác chuyển một đĩa .
• Ta có : f(0) = 0 .
• f(1) =1 .
• f(n) = 2f(n -1) + 1 với n > 0

– Do đó: f(n) = 1+ 21 + 22 +...+ 2n-1 = 2n - 1
Bài toán tháp Hà Nội
•
•
•
•
•
•
•
•

void THN( int n , char X,Y,Z) {
if(n > 0) {
THN(n -1,X,Z,Y ) ;
Move ( X , Z ) ;
THN(n - 1,Y,X,Z ) ;
}
return ;
}
Bài toán chia phần thưởng
• Có 100 phần thưởng đem chia cho
12 học sinh giỏi đã được xếp hạng.
Có bao nhiêu cách khác nhau để thực
hiện cách chia?
• Tìm giải thuật giải bài toàn bằng
phương pháp đệ quy.
Bài toán chia phần thưởng
• Giải bài toán bằng đệ qui
– Nhìn góc độ bài toán tổng quát: Tìm số cách chia
m vật (phần thưởng ) cho n đối tượng (học sinh )
có thứ tự.
– PART(m ,n )
– N đối tượng đã được sắp xếp 1,2,…,n
– Si là số phần thưởng mà i nhận được
• Si >= 0
• S1 >= S2 >= >= Sn .
• S1 + S2 + ...+ Sn = m

– Ví dụ :
• Với m = 5 , n = 3 ta có 5 cách chia sau :

5 0 0 ,4 1 0, 3 2 0 ,3 1 1 ,2 2 1
Tức là PART(5,3 ) = 5
Bài toán chia phần thưởng
• Các trường hợp suy biến
– m = 0 : mọi học sinh đều nhận được 0
phần thưởng .
PART(0 , n ) = 1 với mọi n
– n = 0 , m <> 0 : không có cách chia
PART(m , 0 ) = 0 với mọi m <> 0 .
Bài toán chia phần thưởng
• Phân rã bài toán trong trường hợp
tổng quát
– m < n : n - m học sinh xếp cuối sẽ luôn
không nhận được gì cả trong mọi cách
chia .
Vậy: n > m thì PART(m , n ) = PART(m , m )

– m>=n: là tổng
• Học sinh cuối cùng không có phần thưởng
PART(m , n -1 )
• Học sinh cuối cùng có ít nhất 1
PART(m - n , n )
Vậy: n > m PART(m , n ) = PART(m , n -1 ) +
PART(m - n , n )
Bài toán chia phần thưởng
• Dạng hàm PART trong NN LT C++
int PART( int m , int n ) {
if ((m == 0 ) || (n == 0) ) return 1 ;
else if(m < n ) retrun ( PART(m , m )) ;
else
return ( PART(m , n -1 ) + PART( m -n , n ) ) ;
}
Bài toán tìm tất cả hoán vị của một dãy các phần tử

• Bài toán : In ra tất cả các hoán vị của
dãy A.
• Ví dụ:
– Với dãy A gồm N = 3 phần tử A[1] = a ,
A[2] = b , A[3] = c thì bài toán bắt phải
xuất 6 hoán vị có thể của A :
– abc
acb
cba
bac
cab
bca
– Với n=4 thì bài toán phải xuất ra 24 hoán
vị có thể có của A
Bài toán tìm tất cả hoán vị của một dãy các phần tử

• Thông số hóa bài toán.
– Gọi HV(v, m )
• v : array[1 . . N ] of T
• m :integer ; m <= N
• T là một kiểu dữ liệu

– Ví dụ : N = 4 , A[1] = 1 , A[2] = 2 , A[3] = 3 , A[4] =
4 thì lời gọi HV(A ,3 ) xuất tất cả hoán vị của A có
được bằng cách hoán vị 3 phần tử đầu (có 6 h vị ) :
1234
1324
3214
2134
3124
2314
– Để giải bài toán tổng quát HV(A,N)
Bài toán tìm tất cả hoán vị của một dãy các phần tử

• Trường hợp neo
– Vơi m = 1 : HV(v,1): xuất v
• HV(v,1) ≡ print(v) ≡ for k:= 1 to N do write(v[k])
Bài toán tìm tất cả hoán vị của một dãy các phần tử
• Phân rã bài toán
– Giữ nguyên các phần tử cuối V[m] , . . . ,V[N] hoán vị m-1
phần tử đầu
• gọi đệ quy HV(V ,m - 1)

– Đổi chổ V[m] cho V[m-1] ,giữ nguyên các phần tử cuối
V[m],... ,V[N] hoán vị m-1 phần tử đầu
• gọi đệ quy HV(V ,m - 1)

– Đổi chổ V[m] cho V[m-2] ,giữ nguyên các phần tử cuối
V[m],…. ,V[N] hoán vị m-1 phần tử đầu
• gọi đệ quy HV(V ,m - 1)

– . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . .. . . . . . . . . . .
– . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . .. . . . . . . . . . .
– Đổi chổ V[m] cho V[2] ,giữ nguyên các phần tử cuối V[m], . ..
,V[N] hoán vị m-1 phần tử đầu
• gọi đệ quy HV(V ,m - 1) .

– - Đổi chổ V[m] cho V[1] ,giữ nguyên các phần tử cuối V[m], . .
. ,V[N] hoán vị m-1 phần tử đầu
• gọi đệ quy HV(V ,m - 1) .
Bài toán tìm tất cả hoán vị của một dãy các phần tử
Bài toán tìm tất cả hoán vị của một dãy các phần tử
• HV(V,m) ≡ {
–
–
–
–
–
–
–

SWAP( V[m],V[m] ) ; HV(V,m – 1) ;
SWAP( V[m],v[m-1] ) ; HV(V,m – 1) ;
SWAP( V[m],v[m-2 ] ) ; HV(V,m – 1) ;
...........................
...........................
SWAP (V[m],v[2] ) ; HV(V,m – 1) ;
SWAP( V[m],v[1] ) ; HV(V,m – 1) ;

• }
SWAP(x , y ) là thủ tục hoán đổi giá trị của 2 đối tượng dữ liệu x ,y )

• Vậy :HV(V , m ) ≡ for k := m downto 1 do begin
– SWAP( V[m], V[k] ) ;
– HV(V,m – 1) ;
– end ;
Bài toán tìm tất cả hoán vị của một dãy các phần tử
•
•

•
•

•
•

const size = Val ; // Val là hằng gía trị
typedef typebase vector[size] ; // typebase là một kiểu dữ liệu có thứ tự
......................
void Swap( typebase & x , typebase& y) {
typebase t ;
t=x;x=y;y=t;
}
..........................
void print( const vector &A) {
for(int j= 0 ; j <size ; j++ ) cout<< A[j] ;
cout << “….”;
}
..........................
void HV( const vector &V , int m) {
if (m == 1 ) print( V );

else for(int k = m-1 ; k > = 0 ; k-- ) {
swap(V[m-1] ,V[k] ) ;
HV(V,m-1) ;
}
}
Các bài tập
• Bài toán sắp xếp trộn
• Tìm nghiệm xấp xỉ của một phương trình
3. KHỬ ĐỆ QUY
• 3.1 Cơ chế thực hiện đệ qui
• 3.2 Tổng quan về đệ qui
• 3.3 Các trường hợp khử đệ qui đơn giản
3.1 Cơ chế thực hiện đệ qui
• Trạng thái của tiến trình xử lý một giải thuật: nội
dung các biến và lệnh cần thực hiện kế tiếp.
• Với tiến trình xử lý một giải thuật đệ qui ở từng
thời điểm thực hiện, cần lưu trữ cả các trạng thái
xử lý đang còn dang dở.
3.1 Cơ chế thực hiện đệ qui
• Xét giải thuật giai thừa
– Giải thuật
FAC ( n ) ≡ if(n = 0 ) then retrun 1;
else retrun ( n * FAC (n – 1));
– Sơ đồ thực hiện
3.1 Cơ chế thực hiện đệ qui

• Xét giải thuật hàm đệ qui tính giá trị dãy Fibonacci
– Giải thuật
• FIB(n) {
– if ((n = 0 ) or ( n = 1 )) then return 1 ;
– else return ( FIB(n - 1) + FIB(n - 2))

• };

– Sơ đồ tính FIB(5)
3.1 Cơ chế thực hiện đệ qui
• Xét thủ tục đệ quy tháp Hà Nội THN
(n , X , Y , Z)
– Giải thuật
• THN (n : integer ; X ,Y , Z : char) ≡ {
if (n > 0 ) then { THN(n-1,X ,Z ,Y) ;
Move(X, Z) ;
THN(n-1,Y,X,Z) ;}
}

– Sơ đồ thực hiện THN(3,A,B,C)
3.1 Cơ chế thực hiện đệ qui
3.1 Cơ chế thực hiện đệ qui
• Kết quả thực hiện
–
–
–
–
–
–
–

A --> C ;
A --> B ;
C --> B ;
A --> C ;
B --> A ;
B --> C ;
A --> C ;
3.1 Cơ chế thực hiện đệ qui
• Nhận xét
– Lời gọi đệ quy sinh ra lời gọi đệ quy mới cho đến khi
gặp trường hợp suy biến (neo )
– Ở mỗi lần gọi phải lưu trữ thông tin trạng thái con
dang dở của tiến trình xử lý ở thời điểm gọi. Số trạng
thái này bằng số lần gọi chưa được hoàn tất .
– Khi thực hiện xong (hoàn tất) một lần gọi, cần khôi
phục lại toàn bộ thông tin trạng thái trước khi gọi .
– Lệnh gọi cuối cùng (ứng với trương hợp neo) sẽ được
hoàn tất đầu tiên
– Cấu trúc dữ liệu cho phép lưu trữ dãy thông tin thỏa 3
yêu cầu trên là cấu trúc lưu trữ thỏa mãn LIFO (Last In
Firt Out – Stack)
3.1 Cơ chế thực hiện đệ qui
• Tạo ngăn xếp S
– Thủ tục Creatstack(S) : Tạo chồng S rỗng .
– Thủ tục Push(x,S) : thêm x vào đỉnh stack S
• ( x là dữ liệu kiểu đơn giản giản hoặc có cấu trúc )

– Thủ tục Pop(x,S) : Lấy giá trị đang lưu ở đỉng S
• Lưu trữ vào x
• Loại bỏ giá trị này khỏi S ( lùi đỉnh S xuống một mức ) .

– Hàm Empty(S) : ( kiểu boolean ) Kiểm tra tính rỗng
của S : cho giá trị đúng nếu S rỗng , sai nếu S không
rỗng .
3.1 Cơ chế thực hiện đệ qui
• Lập trình các thủ tục cài đặt Stack
3.2 Tổng quan về khử đệ qui
•

Đệ quy là phương pháp giúp chúng ta tìm giải thuật cho các bài toán
khó . Giải thuật giải bài toán bằng đệ quy thường rất đẹp (gọn gàng,
dễ hiểu ,dễ chuyển thành chương trình trên các NNLT).
• Nhưng như đã chỉ ra ở trên việc xử lý giải thuật đệ quy lại thường
gây khó khăn cho máy tính (tốn không gian nhớ và thời gian xử lý.
• Một cách tổng quát người ta đã chỉ ra rằng : Mọi giải thuật đệ quy
đều có thể thay thế bằng một giải thuật không đệ quy.
• Sơ đồ để xây dựng chương trình cho một bài toán khó khi ta không
tìm được giải thuật không đệ quy thường là :
– Dùng quan niệm đệ quy để tìm giải thuật cho bài toán .
– Mã hóa giải thuật đệ quy .
– Khử đệ quy để có được một chương trình không đệ quy .

•

Tuy nhiên do việc khử đệ quy không phải bao giờ cũng dễ và vì vậy
trong nhiều trường hợp ta cũng phải chấp nhận sư dụng chương trình
đệ quy.
3.3 Các trường hợp khử đệ qui đơn giản
• 3.3.1 Khử đệ qui bằng vòng lặp
– A. Hàm tính gía tri của dãy dữ liệu mô tả bằng hồi quy
• Ý tưởng
– Xét một vòng lặp trong đó sử dụng 1 tập hợp biến W = (V , U )
» Tập hợp U các biến bị thay đổi
» V là các biến còn lại.

– Dạng tổng quát của vòng lặp là : W := Wo ; { Wo = ( Uo,Vo) }
while C(U) do U := g(W)
– Gọi Uo là trạng thái của U ngay trước vòng lặp
– Uk với k >0 là trạng thái của U sau lần lặp thứ k (giả sử còn lặp đến lần k )
Uo mang các giá trị được gán ban đầu
Uk = g(W) = g(Uk-1 , Vo ) = f(uk-1) với k = 1 .. n
Với n là lần lặp cuối cùng , tức C(Uk ) đúng với mọi k < n , C(Un) sai
– Sau vòng lặp W mang nội dung (Un ,Vo ) .
3.3 Các trường hợp khử đệ qui đơn giản
• Giải thuât hồi qui thường gặp
– f(n) = C khi n = no ( C là một hằng )

= g(n,f(n -1)) khi n > no
• Ví dụ :
– Hàm giai thừa FAC (n) = n ! = 1 khi n = 0
= n * FAC(n - 1) khi n > 0
– Tổng n số đầu tiên của dãy đan dấu sau :
Sn = 1 - 3 + 5 - 7 .. + (-1)n+1 * (2n-1)
• S(k) = 1 khi k =1
= S(k-1) + (- 1)k+1 *(2*k-1) với k > 1
3.3 Các trường hợp khử đệ qui đơn giản
•
•

•

Giải thuật đệ quy tính giá trị f(n)
f(n) = if(n = no) return C ;
else return (g(n,f(n -1)) ;
Giải thuật lặp tính giá tri f(n)
k := no ; F := C ;
{ F = f(no) }
While( k < n ){
k := k +1 ;
F := g(k,F ) ;
}
return F;
Trong trường hợp này :
W = U = ( k ,F )
Wo = Uo = ( no,C )
C(U) = ( k < n)
f(W) = f(U) = f(k,F) = (k+1,g(k,F)))
3.3 Các trường hợp khử đệ qui đơn giản
• Khử đệ qui với hàm tính giai thừa
• Trong NN LT C++
long int FAC ( int n ) {
int k = 0 ;
long int F = 1 ;
while ( k < n ) F = ++k * F ;
return (F) ;
}
3.3 Các trường hợp khử đệ qui đơn giản
• Với hàm tính S(n)
• Trong NN LT C++
int S ( int n ) {
int k = 1 , tg = 1 ;
while ( k < n ) {
k ++ ;
if (k%2) tg + = 2 * k - 1 ;
else tg - = 2 * k + 1 ;
}
return ( tg ) ;
}
3.3 Các trường hợp khử đệ qui đơn giản
3.3.2. Các thủ tục đệ qui dạng đệ qui đuôi.
• Xét thủ tục P dạng :
P(X) ≡ if B(X) then D(X)
else {
A(X) ;
P(f(X)) ;
}
• Trong đó : X là tập biến ( một hoặc một bộ nhiều biến ).
• P(X) là thủ tục đệ quy phụ thuộc X
• A(X) ; D(X) là các thao tác không đệ quy
• f(X) là hàm biến đổi X
3.3 Các trường hợp khử đệ qui đơn giản
• Xét qúa trình thi hành P(X) :
–
–
–
–

gọi Po là lần gọi P thứ 0 (đầu tiên ) P(X)
P1 là lần gọi P thứ 1 (lần 2) P(f(X))
Pi là lần gọi P thứ i ( lần i + 1) P(f(f(...f(X)...)
( P(fi(X)) hợp i lần hàm f )

• Gọi Pi nếu B(fi(X))
– (false) { A và gọi Pi+1 }
– (true) { D }

• Giả sử P được gọi đúng n +1 lần . Khi đó ở trong lần gọi
cuối cùng (thứ n ) Pn thì B(fn(X)) =true , lệnh D được thi
hành và chấm dứt thao tác gọi thủ tục P .
3.3 Các trường hợp khử đệ qui đơn giản
• Sơ đồ thực hiện giải thuật trên bằng vòng lặp
While ( ! B(X) ) {
A(X) ;
X = f(X) ;
}
D(X) ;
3.3 Các trường hợp khử đệ qui đơn giản
•

Ví dụ:
–
–
–
–

Để đổi 1 số nguyên không âm Y ở cơ số 10 sang dạng cơ số k ( 2 <= k <= 9 )
Dùng mảng A [n]
Convert(x,m) để tạo dãy gía trị : A[0] , A[1] , . . . , A[m]
Giải thuật
Convert(n,m) ≡ if n != 0 {
A[m] = n % k ;
Convert(n/k , m -1) ;
}

– Trong ví dụ này ta có
•
•
•
•
•

X là ( n, m ) ;
B(X) là biểu thức boolean not( n <> 0 )
A(X) là lệnh gán A[m] := n%k ;
f(X) là hàm f(n,m ) = ( n/k , m - 1 ) ;
D(X) là lệnh rỗng

– Đoan lệnh lặp tương ứng với thủ tục Convert(x,m) là :
While (n != 0) {
A[m] = n % k ;
//A(X)
n=n/k;
// X := f(X)
m=m-1;
}
3.3 Các trường hợp khử đệ qui đơn giản
• Ví dụ: Tìm ước số chung lớn nhất của hai số
• Giải thuật đệ qui
– USCLN(m , n , var us) ≡ if ( n = 0 ) then us := m
else USCLN(n , m mod n , us ) ;
– X là ( m , n , us )
P(X) là USCLN(m ,n ,us)
B(X) là n = 0
D(X) là lệnh gán us := m
A(X) là lệnh rỗng
f(X ) là f(m,n,us) = ( n , m mod n ,us )
3.3 Các trường hợp khử đệ qui đơn giản
• Cài đặt trên ngôn ngữ C
• void USCLN(int m , int n , int& us ) {
while(n != 0 ) {
int sd = m % n ;
m=n;
n = sd ;
}
us = m ;
}
3.3 Các trường hợp khử đệ qui đơn giản
• 3.3.3 Khử đệ qui các trường hợp thường gặp
– Để thực hiện một chương trình con đệ quy thì hệ thống
phải tổ chức vùng lưu trữ thỏa quy tắc LIFO (vùng
Stack).
– Vì vậy sẻ rất có ích khi người lập trình chủ động tạo ra
cấu trúc dữ liệu stack đặc dụng cho từng chương trình
con đệ quy cụ thể .
3.3 Các trường hợp khử đệ qui đơn giản
• A. Đệ qui chỉ có một lệnh gọi trực tiếp
• Đệ qui có dạng sau:
P(X) ≡ if C(X) then D(X)
else begin
A(X) ;
P(f(X)) ;
B(X) ;
end ;
• X là một bién đơn hoặc biến véc tơ.
C(X) là một biểu thức boolean của X .
A(X) , B(X) , D(X):không đệ quy
f(X) là hàm của X
3.3 Các trường hợp khử đệ qui đơn giản
• Tiến trình thực hiện thủ tục P(X) sẻ là :
– Nếu C(X) đúng thì thực hiện D(X) .
– Còn C(X) sai thì thực hiện
• A(X) ;
• gọi P(f(X)) ;
• thực hiện B(X) . ( B(X) chỉ được thực hiện khi P(f(X)) thực
hiện xong ) .

• Mỗi lần thành phần đệ quy P(Y) được gọi thì
thông tin giải thuật B(Y) lại được sinh ra (nhưng
chưa thực hiện ) .
3.3 Các trường hợp khử đệ qui đơn giản
• Gỉa sử qúa trình đệ quy kết thúc sau k lần gọi đệ
quy
– một dãy k thao tác B theo thứ tự :
• B(fk-1(X)) , B(fk-2(X)) , . . . ,B(f(f(X))) ,B(f(X)),B(X).

• Để thực hiện dãy thao tác { B(fi(X)) } theo thứ
tự ngược với thứ tự phát sinh ta cần dãy dữ liệu
{fi(X) } truy xuất theo nguyên tắc LIFO. Ta sẻ
dùng một Stack để lưu trử dãy { fi(X) }
– { X , f(X) , f(f(X)) , . . . , fi(X) , . . . , fk-1(X) }
3.3 Các trường hợp khử đệ qui đơn giản
•

Trình tự thực hiện P(X) được diễn tả bằng mô hình sau :
P(X)
C(X) = False A(X) ; Push(S,X); U:=f(X) ; P(U) ; POP(S,U) ; B(U)
(U=X)
• C(U) = False A(U) ; Push(S,U); U :=f(U)); P(U) ; POP(S,U) ; B(U)
( U = f(X))
• C(U) = False A(U) ; Push(S,U) ; U : = f(U)); P(U ) ; POP(S,U) ; B(U)
--------------------------------------------------------------------------------------• C(U) = False A(U) ;------> Push(S,U) ; U : = f(U)); P(U ) ; POP(S,U) ; B(U)
( U=fk-1(X) )
• C(U) = True D(U )
3.3 Các trường hợp khử đệ qui đơn giản
• Giải thuật thực hiện P(X) với việc sử dụng Stack có dạng :
P(X) ≡{
Creat_Stack (S) ; ( tạo stack S )
While(not(C(X)) do begin A(X) ;
Push(S,X) ; ( cất gía trị X vào stack S )
X := f(X) ;
end ;
D(X) ;
While(not(EmptyS(S))) do begin
POP(S,X) ; ( lấy dữ liệu từ S )
B(X) ;
end ;
}
3.3 Các trường hợp khử đệ qui đơn giản
• Ví dụ :Thủ tục đệ quy chuyển biểu diễn số từ cơ số thập
phân sang nhị phân có dạng :
• Binary(m) ≡ if ( m > 0 ) then begin
Binary( m div 2 ) ;
write( m mod 2 ) ;
end;
• Trong trường hợp này :
X là m .
P(X) là Binary(m) .
A(X) ; D(X) là lệnh rỗng .
B(X) là lệnh Write(m mod 2 ) ;
C(X) là ( m <= 0 ) .
f(X) = f(m) = m div 2 .
3.3 Các trường hợp khử đệ qui đơn giản
• Giái thuật thực hiện Binary(m) không đệ quy là :
– Binary (m ) ≡ { Creat_Stack (S) ;
While ( m > 0 ) do begin
sdu := m mod 2 ;
Push(S,sdu) ;
m := m div 2 ;
end;
While( not(EmptyS(S)) do begin
POP(S,sdu) ;
Write(sdu) ;
end;
}
3.3 Các trường hợp khử đệ qui đơn giản
• B. Thủ tục đệ qui với hai lần gọi đệ qui
– Đệ qui có dạng sau
P(X) ≡ if C(X) then D(X)
else begin
A(X) ; P(f(X)) ;
B(X) ; P(g(X)) ;
end ;
3.3 Các trường hợp khử đệ qui đơn giản
• Qúa trình thực hiện thủ tục P(X) sẻ là :
– Nếu C(X) đúng thì thực hiện D(X) .
– Nếu C(X) sai thì
•
•
•
•

thực hiện A(X) ;
gọi P(f(X)) ;
thực hiện B(X) ;
gọi P(g(X)) , khi gọi P(g(X)) thì lại
– phát sinh lệnh A(g(X))

• Lưu vào stack
– fi(X)
– gi(X) tương ứng . Khi ta lấy dữ liệu từ stack để thực hiện lệnh
B(U) mà chưa gặp điều kiện kết thúc thì ta thực hiện P(g(U)) và lại
phải lưu gía trị g(U) vào stack ,... Điều kiện dừng là khi truy xuất
tới phần tử lưu đầu tiên trong stack .

• Như vậy là ngoài dữ liệu X , con phải lưu vào ngăn xếp
thêm thứ tự lần gọi ( cụm gọi )
3.3 Các trường hợp khử đệ qui đơn giản
•

Thuật toán khử đệ quy tương ứng với thủ tục đệ quy P(X) là :{
Creat_Stack (S) :
Push (S, (X,1)) ;
Repeat

While ( not C(X) ) do begin
A(X) ;
Push (S, (X,2)) ;
X := f(X) ;
end ;
D(X) ;
POP (S, (X,k)) ;
if ( k <> 1) then begin
B(X) ;
X := g(X) ;
end ;
until ( k = 1 ) ;
}
3.3 Các trường hợp khử đệ qui đơn giản
• Khử đệ quy thủ tục Tháp Hà Nội .
• Dạng đệ qui
THN(n , X , Y, Z ) ≡ if( n > 0 ) then begin
THN ( n - 1 , X , Z , Y ) ;
Move ( X , Z ) ;
THN ( n - 1 , Y , X , Z ) ;
end ;
3.3 Các trường hợp khử đệ qui đơn giản
•

Giải thuật không đệ quy tương đương là :{
Creat_Stack (S) ;
Push (S ,(n,X,Y,Z,1)) ;
Repeat
While ( n > 0 ) do begin
Push (S ,(n,X,Y,Z,2)) ;
n := n - 1 ;
Swap (Y,Z ) ; (* Swap(a,b)là thủ tục hoán
end ; đổi nội dung 2 biến a ,b *)
POP (S,(n,X,Y,Z,k)) ;
if ( k <> 1 ) then begin
Move (X ,Z ) ;
n := n - 1 ;
Swap (X ,Y ) ;
end ;
until ( k = 1 ) ;
}

Más contenido relacionado

La actualidad más candente

Oop unit 05 một số kỹ thuật java nâng cao
Oop unit 05 một số kỹ thuật java nâng caoOop unit 05 một số kỹ thuật java nâng cao
Oop unit 05 một số kỹ thuật java nâng caoTráng Hà Viết
 
Oop unit 09 lập trình tổng quát
Oop unit 09 lập trình tổng quátOop unit 09 lập trình tổng quát
Oop unit 09 lập trình tổng quátTráng Hà Viết
 
Bai06 mot sokythuattrongkethua
Bai06 mot sokythuattrongkethuaBai06 mot sokythuattrongkethua
Bai06 mot sokythuattrongkethuaNhuận Lê Văn
 
Nmlt c03 cac_kieudulieucoso_in
Nmlt c03 cac_kieudulieucoso_inNmlt c03 cac_kieudulieucoso_in
Nmlt c03 cac_kieudulieucoso_inHuy Nguyễn
 
Oop unit 11 input và output
Oop unit 11 input và outputOop unit 11 input và output
Oop unit 11 input và outputTráng Hà Viết
 
Bài 1: Tổng quan về cấu trúc và giải thuật - Giáo trình FPT
Bài 1: Tổng quan về cấu trúc và giải thuật - Giáo trình FPTBài 1: Tổng quan về cấu trúc và giải thuật - Giáo trình FPT
Bài 1: Tổng quan về cấu trúc và giải thuật - Giáo trình FPTMasterCode.vn
 
Bài Giảng Hiểu Dữ Liệu Và Tiền Xử Lý Dữ Liệu
Bài Giảng Hiểu Dữ Liệu Và Tiền Xử Lý Dữ Liệu Bài Giảng Hiểu Dữ Liệu Và Tiền Xử Lý Dữ Liệu
Bài Giảng Hiểu Dữ Liệu Và Tiền Xử Lý Dữ Liệu nataliej4
 
Bai04 tao vasudungdoituong
Bai04 tao vasudungdoituongBai04 tao vasudungdoituong
Bai04 tao vasudungdoituongNhuận Lê Văn
 
Python Beginner Class day-02-strings
Python Beginner Class day-02-stringsPython Beginner Class day-02-strings
Python Beginner Class day-02-stringsKhánh Nguyễn
 
Lớp 11 --chương 4 -- bài 11 --Kiểu mảng
Lớp 11 --chương 4 -- bài 11 --Kiểu mảngLớp 11 --chương 4 -- bài 11 --Kiểu mảng
Lớp 11 --chương 4 -- bài 11 --Kiểu mảngHoàng Kỳ Anh
 
Chuong9 lop vadoituong
Chuong9 lop vadoituongChuong9 lop vadoituong
Chuong9 lop vadoituongMinh Ngoc Tran
 

La actualidad más candente (20)

Oop unit 05 một số kỹ thuật java nâng cao
Oop unit 05 một số kỹ thuật java nâng caoOop unit 05 một số kỹ thuật java nâng cao
Oop unit 05 một số kỹ thuật java nâng cao
 
Oop unit 09 lập trình tổng quát
Oop unit 09 lập trình tổng quátOop unit 09 lập trình tổng quát
Oop unit 09 lập trình tổng quát
 
Bai06 mot sokythuattrongkethua
Bai06 mot sokythuattrongkethuaBai06 mot sokythuattrongkethua
Bai06 mot sokythuattrongkethua
 
Nmlt c03 cac_kieudulieucoso_in
Nmlt c03 cac_kieudulieucoso_inNmlt c03 cac_kieudulieucoso_in
Nmlt c03 cac_kieudulieucoso_in
 
Baigiang022 bien va kieu
Baigiang022 bien va kieuBaigiang022 bien va kieu
Baigiang022 bien va kieu
 
Oop unit 11 input và output
Oop unit 11 input và outputOop unit 11 input và output
Oop unit 11 input và output
 
Oop unit 06 kế thừa
Oop unit 06 kế thừaOop unit 06 kế thừa
Oop unit 06 kế thừa
 
Chapter 3 (cont)
Chapter 3 (cont)Chapter 3 (cont)
Chapter 3 (cont)
 
Bài 1: Tổng quan về cấu trúc và giải thuật - Giáo trình FPT
Bài 1: Tổng quan về cấu trúc và giải thuật - Giáo trình FPTBài 1: Tổng quan về cấu trúc và giải thuật - Giáo trình FPT
Bài 1: Tổng quan về cấu trúc và giải thuật - Giáo trình FPT
 
Oop unit 10 ngoại lệ
Oop unit 10 ngoại lệOop unit 10 ngoại lệ
Oop unit 10 ngoại lệ
 
Bài Giảng Hiểu Dữ Liệu Và Tiền Xử Lý Dữ Liệu
Bài Giảng Hiểu Dữ Liệu Và Tiền Xử Lý Dữ Liệu Bài Giảng Hiểu Dữ Liệu Và Tiền Xử Lý Dữ Liệu
Bài Giảng Hiểu Dữ Liệu Và Tiền Xử Lý Dữ Liệu
 
Bai05 ket tapvakethua
Bai05 ket tapvakethuaBai05 ket tapvakethua
Bai05 ket tapvakethua
 
Bai11 ooad bieu_dolop
Bai11 ooad bieu_dolopBai11 ooad bieu_dolop
Bai11 ooad bieu_dolop
 
Bai03 xay dunglop
Bai03 xay dunglopBai03 xay dunglop
Bai03 xay dunglop
 
Bai11
Bai11Bai11
Bai11
 
Bai04 tao vasudungdoituong
Bai04 tao vasudungdoituongBai04 tao vasudungdoituong
Bai04 tao vasudungdoituong
 
Python Beginner Class day-02-strings
Python Beginner Class day-02-stringsPython Beginner Class day-02-strings
Python Beginner Class day-02-strings
 
Lớp 11 --chương 4 -- bài 11 --Kiểu mảng
Lớp 11 --chương 4 -- bài 11 --Kiểu mảngLớp 11 --chương 4 -- bài 11 --Kiểu mảng
Lớp 11 --chương 4 -- bài 11 --Kiểu mảng
 
Chuong9 lop vadoituong
Chuong9 lop vadoituongChuong9 lop vadoituong
Chuong9 lop vadoituong
 
On thitotnghiep
On thitotnghiepOn thitotnghiep
On thitotnghiep
 

Destacado

C3 danh sachlienket
C3 danh sachlienketC3 danh sachlienket
C3 danh sachlienkethiep0109
 
CTDL&GT: Các loại danh sách liên kết
CTDL&GT: Các loại danh sách liên kếtCTDL&GT: Các loại danh sách liên kết
CTDL&GT: Các loại danh sách liên kếtVan-Duyet Le
 
Ky thuatkhudequy
Ky thuatkhudequyKy thuatkhudequy
Ky thuatkhudequyHồ Lợi
 
Chuong 2. de quy dai hoc
Chuong 2. de quy   dai hocChuong 2. de quy   dai hoc
Chuong 2. de quy dai hocVũ Nam
 
Cach giai bai tap ham de quy minh tim duoc
Cach giai bai tap ham de quy minh tim duocCach giai bai tap ham de quy minh tim duoc
Cach giai bai tap ham de quy minh tim duochcmavano
 
Chuong 05 de quy
Chuong 05 de quyChuong 05 de quy
Chuong 05 de quyCau Chu Nho
 
Danh Sach Lien Ket
Danh Sach Lien KetDanh Sach Lien Ket
Danh Sach Lien KetTony Nhân
 
Giáo án bồi dưỡng học sinh giỏi Toán 7
Giáo án bồi dưỡng học sinh giỏi Toán 7Giáo án bồi dưỡng học sinh giỏi Toán 7
Giáo án bồi dưỡng học sinh giỏi Toán 7Lớp 7 Gia sư
 
Bài 7: Danh sách liên kết (LINKED LIST) và tập hợp (SET) - Giáo trình FPT
Bài 7: Danh sách liên kết (LINKED LIST) và tập hợp (SET) - Giáo trình FPTBài 7: Danh sách liên kết (LINKED LIST) và tập hợp (SET) - Giáo trình FPT
Bài 7: Danh sách liên kết (LINKED LIST) và tập hợp (SET) - Giáo trình FPTMasterCode.vn
 

Destacado (10)

C3 danh sachlienket
C3 danh sachlienketC3 danh sachlienket
C3 danh sachlienket
 
CTDL&GT: Các loại danh sách liên kết
CTDL&GT: Các loại danh sách liên kếtCTDL&GT: Các loại danh sách liên kết
CTDL&GT: Các loại danh sách liên kết
 
Ky thuatkhudequy
Ky thuatkhudequyKy thuatkhudequy
Ky thuatkhudequy
 
Giao trinh ky thuat lap trinh 2
Giao trinh ky thuat lap trinh 2Giao trinh ky thuat lap trinh 2
Giao trinh ky thuat lap trinh 2
 
Chuong 2. de quy dai hoc
Chuong 2. de quy   dai hocChuong 2. de quy   dai hoc
Chuong 2. de quy dai hoc
 
Cach giai bai tap ham de quy minh tim duoc
Cach giai bai tap ham de quy minh tim duocCach giai bai tap ham de quy minh tim duoc
Cach giai bai tap ham de quy minh tim duoc
 
Chuong 05 de quy
Chuong 05 de quyChuong 05 de quy
Chuong 05 de quy
 
Danh Sach Lien Ket
Danh Sach Lien KetDanh Sach Lien Ket
Danh Sach Lien Ket
 
Giáo án bồi dưỡng học sinh giỏi Toán 7
Giáo án bồi dưỡng học sinh giỏi Toán 7Giáo án bồi dưỡng học sinh giỏi Toán 7
Giáo án bồi dưỡng học sinh giỏi Toán 7
 
Bài 7: Danh sách liên kết (LINKED LIST) và tập hợp (SET) - Giáo trình FPT
Bài 7: Danh sách liên kết (LINKED LIST) và tập hợp (SET) - Giáo trình FPTBài 7: Danh sách liên kết (LINKED LIST) và tập hợp (SET) - Giáo trình FPT
Bài 7: Danh sách liên kết (LINKED LIST) và tập hợp (SET) - Giáo trình FPT
 

Similar a Programming technique 1_2_7921

06 tong quan ve ngon ngu c
06 tong quan ve ngon ngu c06 tong quan ve ngon ngu c
06 tong quan ve ngon ngu cTrí Nguyễn
 
Ngon ngu c theo chuan ansi
Ngon ngu c theo chuan ansiNgon ngu c theo chuan ansi
Ngon ngu c theo chuan ansiHuynh MVT
 
More about structure - Tìm hiểu sâu về kiểu struct
More about structure - Tìm hiểu sâu về kiểu structMore about structure - Tìm hiểu sâu về kiểu struct
More about structure - Tìm hiểu sâu về kiểu structSon Le
 
Bài giảng Lập trình cơ bản - truongkinhtethucpham.com
Bài giảng Lập trình cơ bản - truongkinhtethucpham.comBài giảng Lập trình cơ bản - truongkinhtethucpham.com
Bài giảng Lập trình cơ bản - truongkinhtethucpham.commai_non
 
Thdc3 Lap Trinh C
Thdc3 Lap Trinh CThdc3 Lap Trinh C
Thdc3 Lap Trinh Cquyloc
 
Python Beginner Class day-04-05-06-iterations
Python Beginner Class day-04-05-06-iterationsPython Beginner Class day-04-05-06-iterations
Python Beginner Class day-04-05-06-iterationsKhánh Nguyễn
 
Bai 1 tong quan ve ctdl&amp;gt
Bai 1   tong quan ve ctdl&amp;gtBai 1   tong quan ve ctdl&amp;gt
Bai 1 tong quan ve ctdl&amp;gtTrangThu251076
 
TRNG_DI_HC_NHA_TRANG.pdf
TRNG_DI_HC_NHA_TRANG.pdfTRNG_DI_HC_NHA_TRANG.pdf
TRNG_DI_HC_NHA_TRANG.pdfPHNGUYNNGC9
 
Giáo trình vb.net
Giáo trình vb.netGiáo trình vb.net
Giáo trình vb.netHung Pham
 
Bài 2 : Các khái niệm và nguyên tắc cơ bản của NET Framework - NỀN TẢNG LẬP T...
Bài 2 : Các khái niệm và nguyên tắc cơ bản của NET Framework - NỀN TẢNG LẬP T...Bài 2 : Các khái niệm và nguyên tắc cơ bản của NET Framework - NỀN TẢNG LẬP T...
Bài 2 : Các khái niệm và nguyên tắc cơ bản của NET Framework - NỀN TẢNG LẬP T...MasterCode.vn
 

Similar a Programming technique 1_2_7921 (20)

06 tong quan ve ngon ngu c
06 tong quan ve ngon ngu c06 tong quan ve ngon ngu c
06 tong quan ve ngon ngu c
 
Ngon ngu c theo chuan ansi
Ngon ngu c theo chuan ansiNgon ngu c theo chuan ansi
Ngon ngu c theo chuan ansi
 
06 tong quan ve ngon ngu c
06 tong quan ve ngon ngu c06 tong quan ve ngon ngu c
06 tong quan ve ngon ngu c
 
03.db.table
03.db.table03.db.table
03.db.table
 
More about structure - Tìm hiểu sâu về kiểu struct
More about structure - Tìm hiểu sâu về kiểu structMore about structure - Tìm hiểu sâu về kiểu struct
More about structure - Tìm hiểu sâu về kiểu struct
 
Bài giảng Lập trình cơ bản - truongkinhtethucpham.com
Bài giảng Lập trình cơ bản - truongkinhtethucpham.comBài giảng Lập trình cơ bản - truongkinhtethucpham.com
Bài giảng Lập trình cơ bản - truongkinhtethucpham.com
 
Ltc 01
Ltc 01Ltc 01
Ltc 01
 
Chapter 6
Chapter 6Chapter 6
Chapter 6
 
Thdc3 Lap Trinh C
Thdc3 Lap Trinh CThdc3 Lap Trinh C
Thdc3 Lap Trinh C
 
Python Beginner Class day-04-05-06-iterations
Python Beginner Class day-04-05-06-iterationsPython Beginner Class day-04-05-06-iterations
Python Beginner Class day-04-05-06-iterations
 
Bai 1 tong quan ve ctdl&amp;gt
Bai 1   tong quan ve ctdl&amp;gtBai 1   tong quan ve ctdl&amp;gt
Bai 1 tong quan ve ctdl&amp;gt
 
chương1.pdf
chương1.pdfchương1.pdf
chương1.pdf
 
Chuong 2@ngon ngu c
Chuong 2@ngon ngu cChuong 2@ngon ngu c
Chuong 2@ngon ngu c
 
TRNG_DI_HC_NHA_TRANG.pdf
TRNG_DI_HC_NHA_TRANG.pdfTRNG_DI_HC_NHA_TRANG.pdf
TRNG_DI_HC_NHA_TRANG.pdf
 
Giáo trình vb.net
Giáo trình vb.netGiáo trình vb.net
Giáo trình vb.net
 
[Cntt] all java
[Cntt] all java[Cntt] all java
[Cntt] all java
 
Bài 2 : Các khái niệm và nguyên tắc cơ bản của NET Framework - NỀN TẢNG LẬP T...
Bài 2 : Các khái niệm và nguyên tắc cơ bản của NET Framework - NỀN TẢNG LẬP T...Bài 2 : Các khái niệm và nguyên tắc cơ bản của NET Framework - NỀN TẢNG LẬP T...
Bài 2 : Các khái niệm và nguyên tắc cơ bản của NET Framework - NỀN TẢNG LẬP T...
 
Chuong 1
Chuong 1Chuong 1
Chuong 1
 
Bai giang c
Bai giang cBai giang c
Bai giang c
 
Chuong1 c
Chuong1 c Chuong1 c
Chuong1 c
 

Más de tienhien110293

Tổng hợp các gợi ý làm bài tập
Tổng hợp các gợi ý làm bài tậpTổng hợp các gợi ý làm bài tập
Tổng hợp các gợi ý làm bài tậptienhien110293
 
Tin hoc dai_cuong_9517
Tin hoc dai_cuong_9517Tin hoc dai_cuong_9517
Tin hoc dai_cuong_9517tienhien110293
 
Tìm hiểu đầy đủ về tràn bộ đệm
Tìm hiểu đầy đủ về tràn bộ đệmTìm hiểu đầy đủ về tràn bộ đệm
Tìm hiểu đầy đủ về tràn bộ đệmtienhien110293
 
Lập trình c căn bản
Lập trình c căn bảnLập trình c căn bản
Lập trình c căn bảntienhien110293
 
Ky thuat lap trinh c tu co ban den nang cao gs.pham van at - 546 trang
Ky thuat lap trinh c tu co ban den nang cao   gs.pham van at - 546 trangKy thuat lap trinh c tu co ban den nang cao   gs.pham van at - 546 trang
Ky thuat lap trinh c tu co ban den nang cao gs.pham van at - 546 trangtienhien110293
 
Tu hoc c_nhanh_nhat_split_1_1055
Tu hoc c_nhanh_nhat_split_1_1055Tu hoc c_nhanh_nhat_split_1_1055
Tu hoc c_nhanh_nhat_split_1_1055tienhien110293
 

Más de tienhien110293 (10)

ưU tiên trong c
ưU tiên trong cưU tiên trong c
ưU tiên trong c
 
Tổng hợp các gợi ý làm bài tập
Tổng hợp các gợi ý làm bài tậpTổng hợp các gợi ý làm bài tập
Tổng hợp các gợi ý làm bài tập
 
Tin hoc dai_cuong_9517
Tin hoc dai_cuong_9517Tin hoc dai_cuong_9517
Tin hoc dai_cuong_9517
 
Tìm hiểu đầy đủ về tràn bộ đệm
Tìm hiểu đầy đủ về tràn bộ đệmTìm hiểu đầy đủ về tràn bộ đệm
Tìm hiểu đầy đủ về tràn bộ đệm
 
Mảng 2 chiều
Mảng 2 chiềuMảng 2 chiều
Mảng 2 chiều
 
Lập trình c căn bản
Lập trình c căn bảnLập trình c căn bản
Lập trình c căn bản
 
Ky thuat lap_trinh
Ky thuat lap_trinhKy thuat lap_trinh
Ky thuat lap_trinh
 
Ky thuat lap trinh c tu co ban den nang cao gs.pham van at - 546 trang
Ky thuat lap trinh c tu co ban den nang cao   gs.pham van at - 546 trangKy thuat lap trinh c tu co ban den nang cao   gs.pham van at - 546 trang
Ky thuat lap trinh c tu co ban den nang cao gs.pham van at - 546 trang
 
Hàm can bản
Hàm can bảnHàm can bản
Hàm can bản
 
Tu hoc c_nhanh_nhat_split_1_1055
Tu hoc c_nhanh_nhat_split_1_1055Tu hoc c_nhanh_nhat_split_1_1055
Tu hoc c_nhanh_nhat_split_1_1055
 

Último

Bài học phòng cháy chữa cháy - PCCC tại tòa nhà
Bài học phòng cháy chữa cháy - PCCC tại tòa nhàBài học phòng cháy chữa cháy - PCCC tại tòa nhà
Bài học phòng cháy chữa cháy - PCCC tại tòa nhàNguyen Thi Trang Nhung
 
Bài tập nhóm Kỹ Năng Gỉai Quyết Tranh Chấp Lao Động (1).pptx
Bài tập nhóm Kỹ Năng Gỉai Quyết Tranh Chấp Lao Động (1).pptxBài tập nhóm Kỹ Năng Gỉai Quyết Tranh Chấp Lao Động (1).pptx
Bài tập nhóm Kỹ Năng Gỉai Quyết Tranh Chấp Lao Động (1).pptxDungxPeach
 
TUYỂN TẬP 50 ĐỀ LUYỆN THI TUYỂN SINH LỚP 10 THPT MÔN TOÁN NĂM 2024 CÓ LỜI GIẢ...
TUYỂN TẬP 50 ĐỀ LUYỆN THI TUYỂN SINH LỚP 10 THPT MÔN TOÁN NĂM 2024 CÓ LỜI GIẢ...TUYỂN TẬP 50 ĐỀ LUYỆN THI TUYỂN SINH LỚP 10 THPT MÔN TOÁN NĂM 2024 CÓ LỜI GIẢ...
TUYỂN TẬP 50 ĐỀ LUYỆN THI TUYỂN SINH LỚP 10 THPT MÔN TOÁN NĂM 2024 CÓ LỜI GIẢ...Nguyen Thanh Tu Collection
 
Giới thiệu Dự án Sản Phụ Khoa - Y Học Cộng Đồng
Giới thiệu Dự án Sản Phụ Khoa - Y Học Cộng ĐồngGiới thiệu Dự án Sản Phụ Khoa - Y Học Cộng Đồng
Giới thiệu Dự án Sản Phụ Khoa - Y Học Cộng ĐồngYhoccongdong.com
 
xemsomenh.com-Vòng Lộc Tồn - Vòng Bác Sĩ và Cách An Trong Vòng Lộc Tồn.pdf
xemsomenh.com-Vòng Lộc Tồn - Vòng Bác Sĩ và Cách An Trong Vòng Lộc Tồn.pdfxemsomenh.com-Vòng Lộc Tồn - Vòng Bác Sĩ và Cách An Trong Vòng Lộc Tồn.pdf
xemsomenh.com-Vòng Lộc Tồn - Vòng Bác Sĩ và Cách An Trong Vòng Lộc Tồn.pdfXem Số Mệnh
 
SD-05_Xây dựng website bán váy Lolita Alice - Phùng Thị Thúy Hiền PH 2 7 8 6 ...
SD-05_Xây dựng website bán váy Lolita Alice - Phùng Thị Thúy Hiền PH 2 7 8 6 ...SD-05_Xây dựng website bán váy Lolita Alice - Phùng Thị Thúy Hiền PH 2 7 8 6 ...
SD-05_Xây dựng website bán váy Lolita Alice - Phùng Thị Thúy Hiền PH 2 7 8 6 ...ChuThNgnFEFPLHN
 
Bài giảng môn Truyền thông đa phương tiện
Bài giảng môn Truyền thông đa phương tiệnBài giảng môn Truyền thông đa phương tiện
Bài giảng môn Truyền thông đa phương tiệnpmtiendhti14a5hn
 
các nội dung phòng chống xâm hại tình dục ở trẻ em
các nội dung phòng chống xâm hại tình dục ở trẻ emcác nội dung phòng chống xâm hại tình dục ở trẻ em
các nội dung phòng chống xâm hại tình dục ở trẻ emTrangNhung96
 
Kiến thức cơ bản về tư duy số - VTC Net Viet
Kiến thức cơ bản về tư duy số - VTC Net VietKiến thức cơ bản về tư duy số - VTC Net Viet
Kiến thức cơ bản về tư duy số - VTC Net VietNguyễn Quang Huy
 
C6. Van de dan toc va ton giao ....pdf . Chu nghia xa hoi
C6. Van de dan toc va ton giao ....pdf . Chu nghia xa hoiC6. Van de dan toc va ton giao ....pdf . Chu nghia xa hoi
C6. Van de dan toc va ton giao ....pdf . Chu nghia xa hoidnghia2002
 
20 ĐỀ DỰ ĐOÁN - PHÁT TRIỂN ĐỀ MINH HỌA BGD KỲ THI TỐT NGHIỆP THPT NĂM 2024 MÔ...
20 ĐỀ DỰ ĐOÁN - PHÁT TRIỂN ĐỀ MINH HỌA BGD KỲ THI TỐT NGHIỆP THPT NĂM 2024 MÔ...20 ĐỀ DỰ ĐOÁN - PHÁT TRIỂN ĐỀ MINH HỌA BGD KỲ THI TỐT NGHIỆP THPT NĂM 2024 MÔ...
20 ĐỀ DỰ ĐOÁN - PHÁT TRIỂN ĐỀ MINH HỌA BGD KỲ THI TỐT NGHIỆP THPT NĂM 2024 MÔ...Nguyen Thanh Tu Collection
 
ĐỀ CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT CÁC TỈNH THÀNH NĂM HỌC 2020 –...
ĐỀ CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT CÁC TỈNH THÀNH NĂM HỌC 2020 –...ĐỀ CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT CÁC TỈNH THÀNH NĂM HỌC 2020 –...
ĐỀ CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT CÁC TỈNH THÀNH NĂM HỌC 2020 –...Nguyen Thanh Tu Collection
 
60 CÂU HỎI ÔN TẬP LÝ LUẬN CHÍNH TRỊ NĂM 2024.docx
60 CÂU HỎI ÔN TẬP LÝ LUẬN CHÍNH TRỊ NĂM 2024.docx60 CÂU HỎI ÔN TẬP LÝ LUẬN CHÍNH TRỊ NĂM 2024.docx
60 CÂU HỎI ÔN TẬP LÝ LUẬN CHÍNH TRỊ NĂM 2024.docxasdnguyendinhdang
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...Nguyen Thanh Tu Collection
 
BỘ LUYỆN NGHE VÀO 10 TIẾNG ANH DẠNG TRẮC NGHIỆM 4 CÂU TRẢ LỜI - CÓ FILE NGHE.pdf
BỘ LUYỆN NGHE VÀO 10 TIẾNG ANH DẠNG TRẮC NGHIỆM 4 CÂU TRẢ LỜI - CÓ FILE NGHE.pdfBỘ LUYỆN NGHE VÀO 10 TIẾNG ANH DẠNG TRẮC NGHIỆM 4 CÂU TRẢ LỜI - CÓ FILE NGHE.pdf
BỘ LUYỆN NGHE VÀO 10 TIẾNG ANH DẠNG TRẮC NGHIỆM 4 CÂU TRẢ LỜI - CÓ FILE NGHE.pdfNguyen Thanh Tu Collection
 
Giáo trình nhập môn lập trình - Đặng Bình Phương
Giáo trình nhập môn lập trình - Đặng Bình PhươngGiáo trình nhập môn lập trình - Đặng Bình Phương
Giáo trình nhập môn lập trình - Đặng Bình Phươnghazzthuan
 
Danh sách sinh viên tốt nghiệp Đại học - Cao đẳng Trường Đại học Phú Yên năm ...
Danh sách sinh viên tốt nghiệp Đại học - Cao đẳng Trường Đại học Phú Yên năm ...Danh sách sinh viên tốt nghiệp Đại học - Cao đẳng Trường Đại học Phú Yên năm ...
Danh sách sinh viên tốt nghiệp Đại học - Cao đẳng Trường Đại học Phú Yên năm ...hoangtuansinh1
 
xemsomenh.com-Vòng Tràng Sinh - Cách An 12 Sao Và Ý Nghĩa Từng Sao.pdf
xemsomenh.com-Vòng Tràng Sinh - Cách An 12 Sao Và Ý Nghĩa Từng Sao.pdfxemsomenh.com-Vòng Tràng Sinh - Cách An 12 Sao Và Ý Nghĩa Từng Sao.pdf
xemsomenh.com-Vòng Tràng Sinh - Cách An 12 Sao Và Ý Nghĩa Từng Sao.pdfXem Số Mệnh
 
bài thi bảo vệ nền tảng tư tưởng của Đảng.docx
bài thi bảo vệ nền tảng tư tưởng của Đảng.docxbài thi bảo vệ nền tảng tư tưởng của Đảng.docx
bài thi bảo vệ nền tảng tư tưởng của Đảng.docxTrnHiYn5
 
Giáo trình xây dựng thực đơn. Ths Hoang Ngoc Hien.pdf
Giáo trình xây dựng thực đơn. Ths Hoang Ngoc Hien.pdfGiáo trình xây dựng thực đơn. Ths Hoang Ngoc Hien.pdf
Giáo trình xây dựng thực đơn. Ths Hoang Ngoc Hien.pdf4pdx29gsr9
 

Último (20)

Bài học phòng cháy chữa cháy - PCCC tại tòa nhà
Bài học phòng cháy chữa cháy - PCCC tại tòa nhàBài học phòng cháy chữa cháy - PCCC tại tòa nhà
Bài học phòng cháy chữa cháy - PCCC tại tòa nhà
 
Bài tập nhóm Kỹ Năng Gỉai Quyết Tranh Chấp Lao Động (1).pptx
Bài tập nhóm Kỹ Năng Gỉai Quyết Tranh Chấp Lao Động (1).pptxBài tập nhóm Kỹ Năng Gỉai Quyết Tranh Chấp Lao Động (1).pptx
Bài tập nhóm Kỹ Năng Gỉai Quyết Tranh Chấp Lao Động (1).pptx
 
TUYỂN TẬP 50 ĐỀ LUYỆN THI TUYỂN SINH LỚP 10 THPT MÔN TOÁN NĂM 2024 CÓ LỜI GIẢ...
TUYỂN TẬP 50 ĐỀ LUYỆN THI TUYỂN SINH LỚP 10 THPT MÔN TOÁN NĂM 2024 CÓ LỜI GIẢ...TUYỂN TẬP 50 ĐỀ LUYỆN THI TUYỂN SINH LỚP 10 THPT MÔN TOÁN NĂM 2024 CÓ LỜI GIẢ...
TUYỂN TẬP 50 ĐỀ LUYỆN THI TUYỂN SINH LỚP 10 THPT MÔN TOÁN NĂM 2024 CÓ LỜI GIẢ...
 
Giới thiệu Dự án Sản Phụ Khoa - Y Học Cộng Đồng
Giới thiệu Dự án Sản Phụ Khoa - Y Học Cộng ĐồngGiới thiệu Dự án Sản Phụ Khoa - Y Học Cộng Đồng
Giới thiệu Dự án Sản Phụ Khoa - Y Học Cộng Đồng
 
xemsomenh.com-Vòng Lộc Tồn - Vòng Bác Sĩ và Cách An Trong Vòng Lộc Tồn.pdf
xemsomenh.com-Vòng Lộc Tồn - Vòng Bác Sĩ và Cách An Trong Vòng Lộc Tồn.pdfxemsomenh.com-Vòng Lộc Tồn - Vòng Bác Sĩ và Cách An Trong Vòng Lộc Tồn.pdf
xemsomenh.com-Vòng Lộc Tồn - Vòng Bác Sĩ và Cách An Trong Vòng Lộc Tồn.pdf
 
SD-05_Xây dựng website bán váy Lolita Alice - Phùng Thị Thúy Hiền PH 2 7 8 6 ...
SD-05_Xây dựng website bán váy Lolita Alice - Phùng Thị Thúy Hiền PH 2 7 8 6 ...SD-05_Xây dựng website bán váy Lolita Alice - Phùng Thị Thúy Hiền PH 2 7 8 6 ...
SD-05_Xây dựng website bán váy Lolita Alice - Phùng Thị Thúy Hiền PH 2 7 8 6 ...
 
Bài giảng môn Truyền thông đa phương tiện
Bài giảng môn Truyền thông đa phương tiệnBài giảng môn Truyền thông đa phương tiện
Bài giảng môn Truyền thông đa phương tiện
 
các nội dung phòng chống xâm hại tình dục ở trẻ em
các nội dung phòng chống xâm hại tình dục ở trẻ emcác nội dung phòng chống xâm hại tình dục ở trẻ em
các nội dung phòng chống xâm hại tình dục ở trẻ em
 
Kiến thức cơ bản về tư duy số - VTC Net Viet
Kiến thức cơ bản về tư duy số - VTC Net VietKiến thức cơ bản về tư duy số - VTC Net Viet
Kiến thức cơ bản về tư duy số - VTC Net Viet
 
C6. Van de dan toc va ton giao ....pdf . Chu nghia xa hoi
C6. Van de dan toc va ton giao ....pdf . Chu nghia xa hoiC6. Van de dan toc va ton giao ....pdf . Chu nghia xa hoi
C6. Van de dan toc va ton giao ....pdf . Chu nghia xa hoi
 
20 ĐỀ DỰ ĐOÁN - PHÁT TRIỂN ĐỀ MINH HỌA BGD KỲ THI TỐT NGHIỆP THPT NĂM 2024 MÔ...
20 ĐỀ DỰ ĐOÁN - PHÁT TRIỂN ĐỀ MINH HỌA BGD KỲ THI TỐT NGHIỆP THPT NĂM 2024 MÔ...20 ĐỀ DỰ ĐOÁN - PHÁT TRIỂN ĐỀ MINH HỌA BGD KỲ THI TỐT NGHIỆP THPT NĂM 2024 MÔ...
20 ĐỀ DỰ ĐOÁN - PHÁT TRIỂN ĐỀ MINH HỌA BGD KỲ THI TỐT NGHIỆP THPT NĂM 2024 MÔ...
 
ĐỀ CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT CÁC TỈNH THÀNH NĂM HỌC 2020 –...
ĐỀ CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT CÁC TỈNH THÀNH NĂM HỌC 2020 –...ĐỀ CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT CÁC TỈNH THÀNH NĂM HỌC 2020 –...
ĐỀ CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT CÁC TỈNH THÀNH NĂM HỌC 2020 –...
 
60 CÂU HỎI ÔN TẬP LÝ LUẬN CHÍNH TRỊ NĂM 2024.docx
60 CÂU HỎI ÔN TẬP LÝ LUẬN CHÍNH TRỊ NĂM 2024.docx60 CÂU HỎI ÔN TẬP LÝ LUẬN CHÍNH TRỊ NĂM 2024.docx
60 CÂU HỎI ÔN TẬP LÝ LUẬN CHÍNH TRỊ NĂM 2024.docx
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
 
BỘ LUYỆN NGHE VÀO 10 TIẾNG ANH DẠNG TRẮC NGHIỆM 4 CÂU TRẢ LỜI - CÓ FILE NGHE.pdf
BỘ LUYỆN NGHE VÀO 10 TIẾNG ANH DẠNG TRẮC NGHIỆM 4 CÂU TRẢ LỜI - CÓ FILE NGHE.pdfBỘ LUYỆN NGHE VÀO 10 TIẾNG ANH DẠNG TRẮC NGHIỆM 4 CÂU TRẢ LỜI - CÓ FILE NGHE.pdf
BỘ LUYỆN NGHE VÀO 10 TIẾNG ANH DẠNG TRẮC NGHIỆM 4 CÂU TRẢ LỜI - CÓ FILE NGHE.pdf
 
Giáo trình nhập môn lập trình - Đặng Bình Phương
Giáo trình nhập môn lập trình - Đặng Bình PhươngGiáo trình nhập môn lập trình - Đặng Bình Phương
Giáo trình nhập môn lập trình - Đặng Bình Phương
 
Danh sách sinh viên tốt nghiệp Đại học - Cao đẳng Trường Đại học Phú Yên năm ...
Danh sách sinh viên tốt nghiệp Đại học - Cao đẳng Trường Đại học Phú Yên năm ...Danh sách sinh viên tốt nghiệp Đại học - Cao đẳng Trường Đại học Phú Yên năm ...
Danh sách sinh viên tốt nghiệp Đại học - Cao đẳng Trường Đại học Phú Yên năm ...
 
xemsomenh.com-Vòng Tràng Sinh - Cách An 12 Sao Và Ý Nghĩa Từng Sao.pdf
xemsomenh.com-Vòng Tràng Sinh - Cách An 12 Sao Và Ý Nghĩa Từng Sao.pdfxemsomenh.com-Vòng Tràng Sinh - Cách An 12 Sao Và Ý Nghĩa Từng Sao.pdf
xemsomenh.com-Vòng Tràng Sinh - Cách An 12 Sao Và Ý Nghĩa Từng Sao.pdf
 
bài thi bảo vệ nền tảng tư tưởng của Đảng.docx
bài thi bảo vệ nền tảng tư tưởng của Đảng.docxbài thi bảo vệ nền tảng tư tưởng của Đảng.docx
bài thi bảo vệ nền tảng tư tưởng của Đảng.docx
 
Giáo trình xây dựng thực đơn. Ths Hoang Ngoc Hien.pdf
Giáo trình xây dựng thực đơn. Ths Hoang Ngoc Hien.pdfGiáo trình xây dựng thực đơn. Ths Hoang Ngoc Hien.pdf
Giáo trình xây dựng thực đơn. Ths Hoang Ngoc Hien.pdf
 

Programming technique 1_2_7921

  • 1. Kỹ thuật lập trình Giảng viên: Đỗ Tuấn Anh Địa chỉ: Bộ môn Khoa học Máy tính 323 C1 ĐHBK Hà Nội Email: anhdt@it-hut.edu.vn Điện thoại: 0989095167
  • 2. Mục tiêu • Nắm bắt được các loại ngôn ngữ lập trình • Kỹ thuật lập trình đệ qui • Tìm hiểu lập trình cấu trúc • Tìm hiểu lập trình hướng đối tượng • Tìm hiểu các thao tác vào ra
  • 3. Nội dung trình bày • Chương 1: Mở đầu – Giới thiệu về ngôn ngữ lập trình – Ngôn ngữ lập trình C • • • • Chương 2: Đệ qui Chương 3: Lập trình cấu trúc Chương 4: Lập trình hướng đối tượng Chương 5: Thao tác vào ra với tệp tin
  • 4. Tài liệu tham khảo • [1] Data Structures and Algorithm Analysis in C – Mark Allen Weiss • [2] Cấu trúc dữ liệu và giải thuật – Đỗ Auân Lôi • [3] Ngôn ngữ lập trình C – Nguyễn Thanh Thủy • [4] Lập trình với các cấu trúc dữ liệu trên Pascal – Lê Minh Trung
  • 5. Chương 1: Mở đầu • Giới thiệu ngôn ngữ lập trình 1. Lịch sử phát triển 2. Các mô hình ngôn ngữ lập trình
  • 6. 1. Lịch sử phát triển ngôn ngữ lập trình • Ngôn ngữ máy • Hợp ngữ (Assembly) • Ngôn ngữ bậc cao – – – – Fortran, Pascal, C, Java, … Prolog Lisp Occam • Ngôn ngữ truy vấn – SQL
  • 7. 2. Phân loại • Ngôn ngư lập trình được phân loại theo phương thức lập trình Phương thức lập trình Mệnh lệnh Thủ tục Hướng đối tượng Khai báo Aử lý song song Logic Hàm CSDL
  • 8. 2. Phân loại (tiếp) • Mệnh lệnh – Thủ tục: Fortran (1957), Pascal (1970), C(1971), … – Đối tượng: Smalltalk (1969), C++(1983), Java(1991), C#(2000),… – Song song: Ada, Occam(1982), C-Linda • Khai báo – Hàm: Lisp(1958), Caml(1987), Miranda(1982) – Logic: Prolog(1970) – CSDL: SQL(1980)
  • 9. 2. Phân loại (tiếp) • Đặc điểm của ngôn ngữ mệnh lệnh – – – – – – – – – – Diễn đạt thuật toán sử dụng tập các trạng thái. Aử lý lần lượt Khai báo dữ liệu Kiểu dữ liệu cơ bản, và kiểu dữ liệu mới Hai kiểu dữ liệu có cùng tên thì tương đương Thay đổi trạng thái thông qua lệnh gán Cấu trúc điều khiển là tuần tự Chương trình con: hàm, thủ tục với truyền tham số Hiệu ứng phụ khi sử dụng chương trình con Bốn mức: Khối, CT con, module, chương trình • Đặc điểm của ngôn ngữ khai báo – Sử dụng các hàm suy luận – Đánh giá một biểu thức
  • 10. 2.1 Lập trình cấu trúc • Chương trình được tổ chức theo các công việc cần thực hiện, phân chia chương trình theo chức năng. • Đặc điểm – Gồm các chương trình con – Thực hiện tuần tự – Các kiểu dữ liệu xây dựng dựa trên kiểu dữ liệu cơ bản • Ngôn ngữ – C, Pascal, …
  • 11. 2.2 Lập trình hướng đối tượng • Aây dựng dựa trên nền tảng khái niệm lập trình có cấu trúc • Phân chia bài toán thành các đối tượng và bài toán đi giải quyết mối quan hệ giữa các đối tượng • Các khái niệm – Class • Method • Properties – Object
  • 12. 3. Ngôn ngữ lập trình C • Trong môn học này dùng C để mô tả các bài toán • Yêu cầu: – Nắm chắc ngôn ngữ C – Cài đặt các bài toán cơ bản trên ngôn ngữ C – Bài tập: Viết một chương trình • Đọc dữ liệu từ file văn bản VB.TAT • Liệt kê các từ có trong văn bản và đếm xem có bao nhiêu lần từ đó xuất hiện và xem nó hiển thị ở trang bao nhiêu (mỗi trang 25 dòng)
  • 14. Ngôn ngữ cấp trung Ngôn ngữ cấp cao C Ngôn ngữ hợp ngữ
  • 15. Đặc điểm của C • C có 32 từ khóa • Những từ khóa này kết hợp với cú pháp của C hình thành ngôn ngữ C • Các quy tắc được áp dụng cho các chương trình C
  • 16. Cấu trúc chương trình C main() • Chương trình C được chia nhỏ thành những đơn vị gọi là hàm • Không kể có bao nhiêu hàm trong chương trình, Hệ điều hành luôn trao quyền điều khiển cho hàm main() khi một chương trình C được thực thi. • Theo sau tên hàm là dấu ngoặc đơn • Dấu ngoặc đơn có thể có chứa hay không chứa những tham số
  • 17. Cấu trúc chương trình C • Dấu phân cách {…} • Dấu kết thúc câu lệnh …; • /*Dòng chú thích*/
  • 18. Biên dịch và thi hành chương trình
  • 19. Biến Bộ nhớ Dữ liệu 15 15 Dữ liệu trong bộ nhớ Mỗi vị trí trong bộ nhớ là duy nhất Biến cho phép cung cấp một tên có ý nghĩa cho mỗi vị trí nhớ
  • 20. Định danh • • • • • Tên của các biến (variables), các hàm (functions), các nhãn (labels) và các đối tượng khác nhau do người dùng định nghĩa gọi là định danh Ví dụ về các định danh đúng – arena – s_count – marks40 – class_one Ví dụ về các định danh sai – 1sttest – oh!god – start... end Các định danh có thể có bất cứ chiều dài nào theo quy ước, nhưng số ký tự trong một biến được nhận diện bởi trình biên dịch thì thay đổi theo trình biên dịch Các định danh trong C có phân biệt chữ hoa và chữ thường
  • 21. Các nguyên tắc đặt tên định danh Tên biến phải bắt đầu bằng một ký tự alphabet Theo sau ký tự đầu có thể là các ký tự chữ, số … Nên tránh đặt tên biến trùng tên các từ khoá Tên biến nên mô tả được ý nghĩa của nó Tránh dùng các ký tự gây lầm lẫn Nên áp dụng các quy ước đặt tên biến chuẩn khi lập trình
  • 22. Kiểu dữ liệu cơ bản Kiểu dữ liệu cơ bản int float double char void
  • 23. Những kiểu dữ liệu dẫn xuất Bộ bổ từ (Modifiers) kiểu dữ liệu Kiểu dữ liệu cơ bản unsigned int short int Kiểu dữ liệu dẫn xuất unsigned int (chỉ là số dương) short int (chiếm ít bộ nhớ hơn int) Long int /longdouble long int/double (chiếm nhiều bộ nhớ hơn int/double)
  • 24. Kiểu dữ liệu & phạm vi giá trị Kiểu Dung lượng tính bằng bit Phạm vi char 8 -128 tới 127 Unsigned char 8 0 tới 255 signed char 8 -128 tới 127 int 16 -32,768 tới 32,767 unsigned int 16 0 tới 65,535 signed int 16 Giống như kiểu int short int 16 Giống như kiểu int unsigned short int 16 0 tới 65, 535
  • 25. Biểu thức (Expressions) Sự kết hợp các toán tử và các toán hạng Toán Tử Ví dụ: 2*y+5 Toán hạng
  • 26. Toán tử gán Toán tử gán (=) có thể được dùng với bất kỳ biểu thức C hợp lệ nào (Tên biến) (Biểu thức) (Giá trị phải) (Giá trị trái) (Toán tử gán)
  • 27. Bốn Kiểu Toán Tử Số học (Arithmetic) Logic (Logical) Quan hệ (Relational) Nhị phân (Bitwise)
  • 28. Vào ra trong C #include <stdio.h> • Đây là câu lệnh tiền xử lý stdio.h là tập tin header (header file) Chứa các macro sử dụng cho nhiều hàm nhập/xuất trong C Các macro trong stdio.h giúp các hàm printf(), scanf(), putchar(), getchar() thực thi
  • 29. Các cấu trúc điều khiển • Rẽ nhánh – If – switch • Lặp – For – While – Do …While
  • 30. Lệnh IF • if (expression) statement; else statement;
  • 32. Vòng lặp For Cú pháp: for (initialize counter; conditional test; re-evaluation parameter) { statement } initialize counter là một lệnh gán để khởi tạo biến điều khiển của vòng lặp trước khi đi vào vòng lặp conditional test là một biểu thức quan hệ để chỉ định khi nào vòng lặp sẽ kết thúc • re-evaluation parameter định nghĩa cách thức thay đổi của biến điều khiển vòng lặp mỗi khi vòng lặp được thực thi
  • 33. Vòng lặp While Cú pháp while (condition is true) statement ; Vòng lặp while lặp lại các lệnh trong khi một biểu thức điều kiện mang giá trị True
  • 34. Vòng lặp Do…While • Cú pháp do{ statement; } while (condition); Trong vòng lặp do while phần thân của vòng lặp được thực thi trước khi biểu thức điều kiện được kiểm tra Khi điều kiện mang giá trị False, vòng lặp do while sẽ được kết thúc, và điều khiển chuyển đến lệnh xuất hiện ngay sau lệnh while
  • 35. Mảng • Danh sách các phần tử có kiểu giống nhau • Khai báo – [Kiểu dữ liệu] [Tên mảng][số lượng phần tử] – Ví dụ: • char a[10]; • a[5] • a+5
  • 37. Chương II: Đệ qui • 1. Mô tả đệ qui • 2. Bài toán đệ qui • 3. Khử đệ qui
  • 38. 1. Mô tả đệ qui • • • • • 1.1 Khái niệm về đệ qui 1.2 Các loại đệ qui 1.3 Mô tả đệ qui các cấu trúc dữ liệu 1.4 Mô tả đệ qui các giải thuật 1.5 Các dạng đệ qui đơn giản thường gặp
  • 39. 1.1 Khái niệm về đệ qui • Mô tả mang tính đệ qui về một đối tượng là mô tả theo cách phân tích đối tượng thành nhiều thành phần mà trong số các thành phần có thành phần mang tính chất của chính đối tượng được mô tả. • Tức là mô tả đối tượng qua chính nó.
  • 40. 1.1 Khái niệm về đệ qui • Mô tả đệ quy tập số tự nhiên N : – Số 1 là số tự nhiên ( 1 - N). – Số tự nhiên bằng số tự nhiên cộng 1. • Mô tả đệ quy cấu trúc ds(list) kiểu T : – Cấu trúc rỗng là một ds kiểu T. – Ghép nối một thành phần kiểu T(nút kiểu T ) với một ds kiểu T ta có một ds kiểu T. • Mô tả đệ quy cây gia phả : Gia phả của một người bao gồm người đó và gia phả của cha và gia phả của mẹ.
  • 41. 1.1 Khái niệm về đệ qui • Mô tả đệ quy thủ tục sắp tăng dãy • a[m:n] ( dãy a[m], a[m+1], . . . , a[n] ) bằng phương pháp Sort_Merge (SM): • SM (a[m:n]) ≡ Merge ( SM(a[m : (n+m) div 2]) , SM (a[(n+m) div 2 +1 : n] ) – Với : SM (a[x : x]) là thao tác rỗng (không làm gì cả ). – Merge (a[x : y] , a[(y+1) : z]) là thủ tục trộn 2 dãy tăng a [x : y] , a[(y+1) : z] để được một dãy a[x : z] tăng.
  • 42. 1.1 Khái niệm về đệ qui • Mô tả đệ qui hàm giai thừa – 0!=1 – F(n)=n*F(n-1) • Ưu điểm của phương pháp mô tả đệ qui – Mô tả tập lớn tác đối tượng chỉ qua một vài mệnh đề – Mô tả một bài toán lớn chỉ qua một số ít thao tác
  • 43. 1.1 Khái niệm về đệ qui • Mô tả đệ qui gồm hai phần – Phần neo:trường hợp suy biến của đối tượng • Ví dụ: 1 là số tự nhiên, cấu trúc rỗng là ds kiểu T, 0 ! = 1 , SM (a[x:x]) là thao tác rỗng. – Phần quy nạp: mô tả đối tượng (giải thuật) thông qua chính đối tượng (giải thuật ) đó một cách trực tiếp hoặc gián tiếp. • Ví dụ: n! = n * (n – 1) ! SM (a[m:n]) ≡ Merge (SM (a[m:( m+n) div 2] , SM (a[(m+n) div 2 +1 : n]) )
  • 44. 1.2 Các loại đệ qui • Gồm hai loại – Đệ qui trực tiếp – Đệ qui gián tiếp
  • 45. 1.2 Các loại đệ qui • Đệ quy trực tiếp là loại đệ quy mà đối tượng được mô tả trực tiếp qua nó – A mô tả qua A, B, C,...trong đó B, C, ... không chứa A. • Đệ quy gián tiếp là loại đệ quy mà đối tượng được mô tả gián tiếp qua nó – A mô tả qua A1 ,A2 ,..., An .Trong đó có một Ai được mô tả qua A.
  • 46. 1.3 Mô tả đệ qui các cấu trúc dữ liệu • Cấu trúc dữ liệu có tính đệ quy thường gồm một số thành phần dữ liệu cùng kiểu được ghép nối theo cùng một phương thức • Ví dụ : – Mô tả đệ quy cây nhi phân :Cây nhi phân kiểu T • Hoặc là một cấu trúc rỗng (phần neo). • Hoặc là một nút kiểu T (nút gốc) và 2 cây nhị phân kiểu T rời nhau (cây con nhị phân phải, cây con nhị phân trái) kết hợp với nhau . – Mô tả đệ quy mảng nhiều chiều : • Mảng một chiều là dãy có thứ tự các thành phần cùng kiểu . • Mảng n chiều là mảng 1 chiều mà các thành phần có kiểu mảng n-1 chiều .
  • 47. 1.4 Mô tả đệ qui các giải thuật • Giải thuật đệ qui – Giải thuật đệ quy là giải thuật có chứa thao tác gọi đến nó – Đặc điểm: mô tả một dãy lớn các thao tác bằng một số ít các thao tác trong đó có chứa thao tác gọi lại giải thuật (gọi đệ quy) – Biểu diễn giải thuật đệ qui • P P[ S , P ] • Điều kiện dừng – Biểu diễn tổng quát • P if B then P[ S , P ] • hoặc P P[ S , if B then P ] • Chương trình con đệ qui – Hàm đệ qui – Thủ tục đệ qui
  • 48. 1.4 Mô tả đệ qui các giải thuật • Dãy các giai thừa : { n! } ? 1 ,1 , 2 , 6 , 24 , 120 . . . – Ký hiệu FAC(n ) = n ! . • FAC(0 ) = 1 ; ( 0 ! = 1 ) • FAC(n ) = n * FAC(n - 1 ) ; ( n ! = n * (n - 1 ) ! ) với n >= 1 • Giải thuật đệ quy tính FAC(n ) là : – FAC(n ) – if (n = 0 ) then return 1 ; – else return (n * FAC(n - 1 )) ;
  • 49. 1.4 Mô tả đệ qui các giải thuật • Dãy số Fibonaci(FIBO) :{ FIBO (n) } ≡ 1 ,1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55 , 89 , 144 , 233 , 377 , . .. – FIBO(0 ) = FIBO (1 ) = 1 ; – FIBO(n ) = FIBO (n - 1 ) + FIBO ( n - 2 ) ; với n > = 2 • Giải thuật đệ quy tính FIBO ( n ) là : – FIBO(n) – if ((n = 0 ) or ( n = 1 )) then return 1 ; – else return ( FIBO (n - 1) + FIBO (n - 2)) ;
  • 50. 1.5 Các dạng đệ qui đơn giản thường gặp • Đệ qui tuyến tính: là dạng đệ qui trực tiếp đơn giản nhất có dạng – P { – If (B) thực hiện S; – else { thực hiện S* ; gọi P } – } Với S , S* là các thao tác không đệ quy . Ví dụ:Hàm FAC(n) tính số hạng n của dãy n! – Dạng hàm trong ngôn ngữ mã giả : • { Nếu n = 0 thì FAC = 1 ; /* trường hợp neo*/ • Ngược lại FAC = n*FAC(n-1) } – Dạng hàm trong C++ : • • • • int FAC( int n ) { if ( n == 0 ) return 1 ; else return ( n * FAC(n-1 )) ; }
  • 51. 1.5 Các dạng đệ qui đơn giản thường gặp • Chương trình con tính USCLN của 2 số dựa vào thuật toán Euclide – Dạng hàm trên ngôn ngữ toán học • USCLN(m , n ) = USCLN(n , m mod n ) khi n ≠ 0 • USCLN(m , 0) = m – Dạng hàm trong C++ : • int USCLN( int m , int n ) • { if(n == 0 ) return (m) ; • else return ( USCLN( n , m mod n)) ; }
  • 52. 1.5 Các dạng đệ qui đơn giản thường gặp (tiếp) • Đệ qui nhị phân: là đệ qui trực tiếp có dạng như sau – P { – If (B) thực hiện S; – else { thực hiện S* ; gọi P ; gọi P} – } Với S , S* là các thao tác không đệ quy . Ví dụ : Hàm FIBO(n) tính số hạng n của dãy FIBONACCI – Dạng hàm trong C++ : • int F(int n) • { if ( n < 2 ) return 1 ; • else return (F(n -1) + F(n -2)) ; }
  • 53. 1.5 Các dạng đệ qui đơn giản thường gặp (tiếp) • Đệ qui phi tuyến: là đệ quy trực tiếp mà lời gọi đệ quy được thực hiện bên trong vòng lặp. – P { – for (<giá tri đầu> to <giá trị cuối>) – {thực hiện S ; – if ( thỏa điều kiện dừng ) then thực hiện S*; – else gọi P;} – } Với S , S* là các thao tác không đệ quy . – Ví dụ: Cho dãy { An } xác định theo công thức truy hồi : A0 = 1 ; An = n2 A0 +(n-1)2 A1 + . . . + 22 An-2 + 12 An-1
  • 54. 1.5 Các dạng đệ qui đơn giản thường gặp (tiếp) • Dạng hàm đệ quy tính An trên ngôn ngữ C++ là : – – – – – – – int A( int n ) { if ( n == 0 ) return 1 ; else { int tg = 0 ; for (int i = 0 ; i<n ; i++ ) tg = tg + sqr(n-i) *A(i); return ( tg ) ; }
  • 55. 2. Bài toán đệ qui • 2.1 Tìm giải thuật đệ qui • 2.2 Một số bài toán giải bằng đệ qui
  • 56. 2.1 Tìm giải thuật đệ qui • Thực hiện 3 bước – Thông số hóa bài toán . – Tìm các trường hợp neo cùng giải thuật giải tương ứng – Tìm giải thuật giải trong trường hợp tổng quát bằng phân rã bài toán theo kiểu đệ quy.
  • 57. 2.1 Tìm giải thuật đệ qui • Thông số hóa bài toán – Tổng quát hóa bài toán cụ thể cần giải thành bài toán tổng quát (một họ các bài toán chứa bài toán cần giải ) – Tìm ra các thông số cho bài toán tổng quát • các thông số điều khiển: các thông số mà độ lớn của chúng đặc trưng cho độ phức tạp của bài toán , và giảm đi qua mỗi lần gọi đệ qui. – Ví dụ • n trong hàm FAC(n) ; • a , b trong hàm USCLN(a,b) .
  • 58. 2.1 Tìm giải thuật đệ qui (tiếp) • Phát hiện trường hợp suy biến – trường hợp suy biến của bài toán tổng quát – các trường hợp tương ứng với các gía trị biên của các biến điều khiển • Ví dụ : FAC(1) =1 USCLN(a,0) = a SM(a[x:x]) ≡∅ TSUM(a[m:m]) = a[m]
  • 59. 2.1 Tìm giải thuật đệ qui (tiếp) • Phân rã bài toán tổng quát theo phương thức đệ qui – Tìm phương án (giải thuật ) giải bài toán trong trường hợp tổng quát phân chia nó thành các thành phần • giải thuật không đệ quy • bài toán trên nhưng có kích thước nhỏ hơn. • Ví dụ – FAC(n) = n * FAC(n -1) . – Tmax(a[1:n]) = max(Tmax(a[1:(n-1)]) , a[n] )
  • 60. 2.2 Một số bài toán giải bằng đệ qui • Bài toán tháp Hà Nội • Bài toán chia phần thưởng • Bài toán hoán vị
  • 61. 2.2 Một số bài toán giải bằng đệ qui (tiếp) • Bài toán tháp Hà Nội – Truyền thuyết kể rằng : Một nhà toán học Pháp sang thăm Đông Dương đến một ngôi chùa cổ ở Hà Nội thấy các vị sư đang chuyển một chồng đĩa qúy gồm 64 đĩa với kích thước khác nhau từ cột A sang cột C theo cách : • Mỗi lần chỉ chuyển 1 đĩa . • Khi chuyển có thể dùng cột trung gian B . • Trong suốt qúa trình chuyển các chồng đĩa ở các cột luôn được xếp đúng (đĩa có kích thước bé được đặt trên đĩa có kích thước lớn ) . – Khi được hỏi các vị sư cho biết khi chuyển xong chồng đĩa thì đến ngày tận thế ! • Phân tích – Với chồng gồm n đĩa cần 2n- 1 lần chuyển – Giả sử thời gian để chuyển 1 đỉa là t giây thì thời gian để chuyển xong chồng 64 đĩa sẽ là : – T = ( 264 -1) * t = 1.84 1019 t – Với t = 1/100 s thì T = 5.8*109 năm = 5.8 tỷ năm .
  • 62. Bài toán tháp Hà Nội • Giải bài toán bằng đệ qui – Thông số hóa bài toán • Xét bài toán ở mức tổng quát nhất : chuyển n (n>=0) đĩa từ cột A sang cột C lấy cột B làm trung gian . • THN(n ,A ,B,C) -> với 64 đĩa gọi THN(64,A ,B,C) • n sẽ là thông số quyết định bài toán – n là tham số điều khiển – Trường hợp suy biến và cách giải • Với n =1 : THN (1,A,B,C) – Giải thuật giải bài toán THN (1,A,B,C) là thực hiện chỉ 1 thao tác cơ bản : Chuyển 1 đĩa từ A sang C ( ký hiệu là Move (A , C) ) . • THN(1,A,B,C) ≡ { Move( A, C ) } . • THN(0, A,B,C) ≡ { φ }
  • 63. Bài toán tháp Hà Nội • Phân rã bài toán – Ta có thể phần rã bài toán TH N (k,A,B,C) : chuyển k đĩa từ cột A sang cột C lấy cột B làm trung gian thành dãy tuần tự 3 công việc sau : • Chuyển (k -1) đĩa từ cột A sang cột B lấy cột C làm trung gian : – THN (k -1,A,C,B) (bài toán THN với n = k-1,A= A , B = C , C =B) • Chuyển 1 đĩa từ cột A sang cột C : Move ( A, C ) (thao tác cơ bản ). • Chuyển (k - 1 ) đĩa từ cột B sang cột C lấy cột A làm trung gian : – THN( k -1,B,A,C) ( bài toán THN với n = k-1 , A = B , B = A , C=C).
  • 64. Bài toán tháp Hà Nội • Vậy giải thuật trong trường hợp tổng quát (n > 1) là : – THN(n,X,Y,Z) ≡ { • • • • THN (n -1,X,Z,Y) ; Move ( X, Z ) ; THN (n -1,Y,X,Z) ; }
  • 65. Bài toán tháp Hà Nội • Độ phức tạp của bài toán – Với n đĩa , gọi f(n) là số các thao tác chuyển một đĩa . • Ta có : f(0) = 0 . • f(1) =1 . • f(n) = 2f(n -1) + 1 với n > 0 – Do đó: f(n) = 1+ 21 + 22 +...+ 2n-1 = 2n - 1
  • 66. Bài toán tháp Hà Nội • • • • • • • • void THN( int n , char X,Y,Z) { if(n > 0) { THN(n -1,X,Z,Y ) ; Move ( X , Z ) ; THN(n - 1,Y,X,Z ) ; } return ; }
  • 67. Bài toán chia phần thưởng • Có 100 phần thưởng đem chia cho 12 học sinh giỏi đã được xếp hạng. Có bao nhiêu cách khác nhau để thực hiện cách chia? • Tìm giải thuật giải bài toàn bằng phương pháp đệ quy.
  • 68. Bài toán chia phần thưởng • Giải bài toán bằng đệ qui – Nhìn góc độ bài toán tổng quát: Tìm số cách chia m vật (phần thưởng ) cho n đối tượng (học sinh ) có thứ tự. – PART(m ,n ) – N đối tượng đã được sắp xếp 1,2,…,n – Si là số phần thưởng mà i nhận được • Si >= 0 • S1 >= S2 >= >= Sn . • S1 + S2 + ...+ Sn = m – Ví dụ : • Với m = 5 , n = 3 ta có 5 cách chia sau : 5 0 0 ,4 1 0, 3 2 0 ,3 1 1 ,2 2 1 Tức là PART(5,3 ) = 5
  • 69. Bài toán chia phần thưởng • Các trường hợp suy biến – m = 0 : mọi học sinh đều nhận được 0 phần thưởng . PART(0 , n ) = 1 với mọi n – n = 0 , m <> 0 : không có cách chia PART(m , 0 ) = 0 với mọi m <> 0 .
  • 70. Bài toán chia phần thưởng • Phân rã bài toán trong trường hợp tổng quát – m < n : n - m học sinh xếp cuối sẽ luôn không nhận được gì cả trong mọi cách chia . Vậy: n > m thì PART(m , n ) = PART(m , m ) – m>=n: là tổng • Học sinh cuối cùng không có phần thưởng PART(m , n -1 ) • Học sinh cuối cùng có ít nhất 1 PART(m - n , n ) Vậy: n > m PART(m , n ) = PART(m , n -1 ) + PART(m - n , n )
  • 71. Bài toán chia phần thưởng • Dạng hàm PART trong NN LT C++ int PART( int m , int n ) { if ((m == 0 ) || (n == 0) ) return 1 ; else if(m < n ) retrun ( PART(m , m )) ; else return ( PART(m , n -1 ) + PART( m -n , n ) ) ; }
  • 72. Bài toán tìm tất cả hoán vị của một dãy các phần tử • Bài toán : In ra tất cả các hoán vị của dãy A. • Ví dụ: – Với dãy A gồm N = 3 phần tử A[1] = a , A[2] = b , A[3] = c thì bài toán bắt phải xuất 6 hoán vị có thể của A : – abc acb cba bac cab bca – Với n=4 thì bài toán phải xuất ra 24 hoán vị có thể có của A
  • 73. Bài toán tìm tất cả hoán vị của một dãy các phần tử • Thông số hóa bài toán. – Gọi HV(v, m ) • v : array[1 . . N ] of T • m :integer ; m <= N • T là một kiểu dữ liệu – Ví dụ : N = 4 , A[1] = 1 , A[2] = 2 , A[3] = 3 , A[4] = 4 thì lời gọi HV(A ,3 ) xuất tất cả hoán vị của A có được bằng cách hoán vị 3 phần tử đầu (có 6 h vị ) : 1234 1324 3214 2134 3124 2314 – Để giải bài toán tổng quát HV(A,N)
  • 74. Bài toán tìm tất cả hoán vị của một dãy các phần tử • Trường hợp neo – Vơi m = 1 : HV(v,1): xuất v • HV(v,1) ≡ print(v) ≡ for k:= 1 to N do write(v[k])
  • 75. Bài toán tìm tất cả hoán vị của một dãy các phần tử • Phân rã bài toán – Giữ nguyên các phần tử cuối V[m] , . . . ,V[N] hoán vị m-1 phần tử đầu • gọi đệ quy HV(V ,m - 1) – Đổi chổ V[m] cho V[m-1] ,giữ nguyên các phần tử cuối V[m],... ,V[N] hoán vị m-1 phần tử đầu • gọi đệ quy HV(V ,m - 1) – Đổi chổ V[m] cho V[m-2] ,giữ nguyên các phần tử cuối V[m],…. ,V[N] hoán vị m-1 phần tử đầu • gọi đệ quy HV(V ,m - 1) – . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . .. . . . . . . . . . . – . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . .. . . . . . . . . . . – Đổi chổ V[m] cho V[2] ,giữ nguyên các phần tử cuối V[m], . .. ,V[N] hoán vị m-1 phần tử đầu • gọi đệ quy HV(V ,m - 1) . – - Đổi chổ V[m] cho V[1] ,giữ nguyên các phần tử cuối V[m], . . . ,V[N] hoán vị m-1 phần tử đầu • gọi đệ quy HV(V ,m - 1) .
  • 76. Bài toán tìm tất cả hoán vị của một dãy các phần tử
  • 77. Bài toán tìm tất cả hoán vị của một dãy các phần tử • HV(V,m) ≡ { – – – – – – – SWAP( V[m],V[m] ) ; HV(V,m – 1) ; SWAP( V[m],v[m-1] ) ; HV(V,m – 1) ; SWAP( V[m],v[m-2 ] ) ; HV(V,m – 1) ; ........................... ........................... SWAP (V[m],v[2] ) ; HV(V,m – 1) ; SWAP( V[m],v[1] ) ; HV(V,m – 1) ; • } SWAP(x , y ) là thủ tục hoán đổi giá trị của 2 đối tượng dữ liệu x ,y ) • Vậy :HV(V , m ) ≡ for k := m downto 1 do begin – SWAP( V[m], V[k] ) ; – HV(V,m – 1) ; – end ;
  • 78. Bài toán tìm tất cả hoán vị của một dãy các phần tử • • • • • • const size = Val ; // Val là hằng gía trị typedef typebase vector[size] ; // typebase là một kiểu dữ liệu có thứ tự ...................... void Swap( typebase & x , typebase& y) { typebase t ; t=x;x=y;y=t; } .......................... void print( const vector &A) { for(int j= 0 ; j <size ; j++ ) cout<< A[j] ; cout << “….”; } .......................... void HV( const vector &V , int m) { if (m == 1 ) print( V ); else for(int k = m-1 ; k > = 0 ; k-- ) { swap(V[m-1] ,V[k] ) ; HV(V,m-1) ; } }
  • 79. Các bài tập • Bài toán sắp xếp trộn • Tìm nghiệm xấp xỉ của một phương trình
  • 80. 3. KHỬ ĐỆ QUY • 3.1 Cơ chế thực hiện đệ qui • 3.2 Tổng quan về đệ qui • 3.3 Các trường hợp khử đệ qui đơn giản
  • 81. 3.1 Cơ chế thực hiện đệ qui • Trạng thái của tiến trình xử lý một giải thuật: nội dung các biến và lệnh cần thực hiện kế tiếp. • Với tiến trình xử lý một giải thuật đệ qui ở từng thời điểm thực hiện, cần lưu trữ cả các trạng thái xử lý đang còn dang dở.
  • 82. 3.1 Cơ chế thực hiện đệ qui • Xét giải thuật giai thừa – Giải thuật FAC ( n ) ≡ if(n = 0 ) then retrun 1; else retrun ( n * FAC (n – 1)); – Sơ đồ thực hiện
  • 83. 3.1 Cơ chế thực hiện đệ qui • Xét giải thuật hàm đệ qui tính giá trị dãy Fibonacci – Giải thuật • FIB(n) { – if ((n = 0 ) or ( n = 1 )) then return 1 ; – else return ( FIB(n - 1) + FIB(n - 2)) • }; – Sơ đồ tính FIB(5)
  • 84. 3.1 Cơ chế thực hiện đệ qui • Xét thủ tục đệ quy tháp Hà Nội THN (n , X , Y , Z) – Giải thuật • THN (n : integer ; X ,Y , Z : char) ≡ { if (n > 0 ) then { THN(n-1,X ,Z ,Y) ; Move(X, Z) ; THN(n-1,Y,X,Z) ;} } – Sơ đồ thực hiện THN(3,A,B,C)
  • 85. 3.1 Cơ chế thực hiện đệ qui
  • 86. 3.1 Cơ chế thực hiện đệ qui • Kết quả thực hiện – – – – – – – A --> C ; A --> B ; C --> B ; A --> C ; B --> A ; B --> C ; A --> C ;
  • 87. 3.1 Cơ chế thực hiện đệ qui • Nhận xét – Lời gọi đệ quy sinh ra lời gọi đệ quy mới cho đến khi gặp trường hợp suy biến (neo ) – Ở mỗi lần gọi phải lưu trữ thông tin trạng thái con dang dở của tiến trình xử lý ở thời điểm gọi. Số trạng thái này bằng số lần gọi chưa được hoàn tất . – Khi thực hiện xong (hoàn tất) một lần gọi, cần khôi phục lại toàn bộ thông tin trạng thái trước khi gọi . – Lệnh gọi cuối cùng (ứng với trương hợp neo) sẽ được hoàn tất đầu tiên – Cấu trúc dữ liệu cho phép lưu trữ dãy thông tin thỏa 3 yêu cầu trên là cấu trúc lưu trữ thỏa mãn LIFO (Last In Firt Out – Stack)
  • 88. 3.1 Cơ chế thực hiện đệ qui • Tạo ngăn xếp S – Thủ tục Creatstack(S) : Tạo chồng S rỗng . – Thủ tục Push(x,S) : thêm x vào đỉnh stack S • ( x là dữ liệu kiểu đơn giản giản hoặc có cấu trúc ) – Thủ tục Pop(x,S) : Lấy giá trị đang lưu ở đỉng S • Lưu trữ vào x • Loại bỏ giá trị này khỏi S ( lùi đỉnh S xuống một mức ) . – Hàm Empty(S) : ( kiểu boolean ) Kiểm tra tính rỗng của S : cho giá trị đúng nếu S rỗng , sai nếu S không rỗng .
  • 89. 3.1 Cơ chế thực hiện đệ qui • Lập trình các thủ tục cài đặt Stack
  • 90. 3.2 Tổng quan về khử đệ qui • Đệ quy là phương pháp giúp chúng ta tìm giải thuật cho các bài toán khó . Giải thuật giải bài toán bằng đệ quy thường rất đẹp (gọn gàng, dễ hiểu ,dễ chuyển thành chương trình trên các NNLT). • Nhưng như đã chỉ ra ở trên việc xử lý giải thuật đệ quy lại thường gây khó khăn cho máy tính (tốn không gian nhớ và thời gian xử lý. • Một cách tổng quát người ta đã chỉ ra rằng : Mọi giải thuật đệ quy đều có thể thay thế bằng một giải thuật không đệ quy. • Sơ đồ để xây dựng chương trình cho một bài toán khó khi ta không tìm được giải thuật không đệ quy thường là : – Dùng quan niệm đệ quy để tìm giải thuật cho bài toán . – Mã hóa giải thuật đệ quy . – Khử đệ quy để có được một chương trình không đệ quy . • Tuy nhiên do việc khử đệ quy không phải bao giờ cũng dễ và vì vậy trong nhiều trường hợp ta cũng phải chấp nhận sư dụng chương trình đệ quy.
  • 91. 3.3 Các trường hợp khử đệ qui đơn giản • 3.3.1 Khử đệ qui bằng vòng lặp – A. Hàm tính gía tri của dãy dữ liệu mô tả bằng hồi quy • Ý tưởng – Xét một vòng lặp trong đó sử dụng 1 tập hợp biến W = (V , U ) » Tập hợp U các biến bị thay đổi » V là các biến còn lại. – Dạng tổng quát của vòng lặp là : W := Wo ; { Wo = ( Uo,Vo) } while C(U) do U := g(W) – Gọi Uo là trạng thái của U ngay trước vòng lặp – Uk với k >0 là trạng thái của U sau lần lặp thứ k (giả sử còn lặp đến lần k ) Uo mang các giá trị được gán ban đầu Uk = g(W) = g(Uk-1 , Vo ) = f(uk-1) với k = 1 .. n Với n là lần lặp cuối cùng , tức C(Uk ) đúng với mọi k < n , C(Un) sai – Sau vòng lặp W mang nội dung (Un ,Vo ) .
  • 92. 3.3 Các trường hợp khử đệ qui đơn giản • Giải thuât hồi qui thường gặp – f(n) = C khi n = no ( C là một hằng ) = g(n,f(n -1)) khi n > no • Ví dụ : – Hàm giai thừa FAC (n) = n ! = 1 khi n = 0 = n * FAC(n - 1) khi n > 0 – Tổng n số đầu tiên của dãy đan dấu sau : Sn = 1 - 3 + 5 - 7 .. + (-1)n+1 * (2n-1) • S(k) = 1 khi k =1 = S(k-1) + (- 1)k+1 *(2*k-1) với k > 1
  • 93. 3.3 Các trường hợp khử đệ qui đơn giản • • • Giải thuật đệ quy tính giá trị f(n) f(n) = if(n = no) return C ; else return (g(n,f(n -1)) ; Giải thuật lặp tính giá tri f(n) k := no ; F := C ; { F = f(no) } While( k < n ){ k := k +1 ; F := g(k,F ) ; } return F; Trong trường hợp này : W = U = ( k ,F ) Wo = Uo = ( no,C ) C(U) = ( k < n) f(W) = f(U) = f(k,F) = (k+1,g(k,F)))
  • 94. 3.3 Các trường hợp khử đệ qui đơn giản • Khử đệ qui với hàm tính giai thừa • Trong NN LT C++ long int FAC ( int n ) { int k = 0 ; long int F = 1 ; while ( k < n ) F = ++k * F ; return (F) ; }
  • 95. 3.3 Các trường hợp khử đệ qui đơn giản • Với hàm tính S(n) • Trong NN LT C++ int S ( int n ) { int k = 1 , tg = 1 ; while ( k < n ) { k ++ ; if (k%2) tg + = 2 * k - 1 ; else tg - = 2 * k + 1 ; } return ( tg ) ; }
  • 96. 3.3 Các trường hợp khử đệ qui đơn giản 3.3.2. Các thủ tục đệ qui dạng đệ qui đuôi. • Xét thủ tục P dạng : P(X) ≡ if B(X) then D(X) else { A(X) ; P(f(X)) ; } • Trong đó : X là tập biến ( một hoặc một bộ nhiều biến ). • P(X) là thủ tục đệ quy phụ thuộc X • A(X) ; D(X) là các thao tác không đệ quy • f(X) là hàm biến đổi X
  • 97. 3.3 Các trường hợp khử đệ qui đơn giản • Xét qúa trình thi hành P(X) : – – – – gọi Po là lần gọi P thứ 0 (đầu tiên ) P(X) P1 là lần gọi P thứ 1 (lần 2) P(f(X)) Pi là lần gọi P thứ i ( lần i + 1) P(f(f(...f(X)...) ( P(fi(X)) hợp i lần hàm f ) • Gọi Pi nếu B(fi(X)) – (false) { A và gọi Pi+1 } – (true) { D } • Giả sử P được gọi đúng n +1 lần . Khi đó ở trong lần gọi cuối cùng (thứ n ) Pn thì B(fn(X)) =true , lệnh D được thi hành và chấm dứt thao tác gọi thủ tục P .
  • 98. 3.3 Các trường hợp khử đệ qui đơn giản • Sơ đồ thực hiện giải thuật trên bằng vòng lặp While ( ! B(X) ) { A(X) ; X = f(X) ; } D(X) ;
  • 99. 3.3 Các trường hợp khử đệ qui đơn giản • Ví dụ: – – – – Để đổi 1 số nguyên không âm Y ở cơ số 10 sang dạng cơ số k ( 2 <= k <= 9 ) Dùng mảng A [n] Convert(x,m) để tạo dãy gía trị : A[0] , A[1] , . . . , A[m] Giải thuật Convert(n,m) ≡ if n != 0 { A[m] = n % k ; Convert(n/k , m -1) ; } – Trong ví dụ này ta có • • • • • X là ( n, m ) ; B(X) là biểu thức boolean not( n <> 0 ) A(X) là lệnh gán A[m] := n%k ; f(X) là hàm f(n,m ) = ( n/k , m - 1 ) ; D(X) là lệnh rỗng – Đoan lệnh lặp tương ứng với thủ tục Convert(x,m) là : While (n != 0) { A[m] = n % k ; //A(X) n=n/k; // X := f(X) m=m-1; }
  • 100. 3.3 Các trường hợp khử đệ qui đơn giản • Ví dụ: Tìm ước số chung lớn nhất của hai số • Giải thuật đệ qui – USCLN(m , n , var us) ≡ if ( n = 0 ) then us := m else USCLN(n , m mod n , us ) ; – X là ( m , n , us ) P(X) là USCLN(m ,n ,us) B(X) là n = 0 D(X) là lệnh gán us := m A(X) là lệnh rỗng f(X ) là f(m,n,us) = ( n , m mod n ,us )
  • 101. 3.3 Các trường hợp khử đệ qui đơn giản • Cài đặt trên ngôn ngữ C • void USCLN(int m , int n , int& us ) { while(n != 0 ) { int sd = m % n ; m=n; n = sd ; } us = m ; }
  • 102. 3.3 Các trường hợp khử đệ qui đơn giản • 3.3.3 Khử đệ qui các trường hợp thường gặp – Để thực hiện một chương trình con đệ quy thì hệ thống phải tổ chức vùng lưu trữ thỏa quy tắc LIFO (vùng Stack). – Vì vậy sẻ rất có ích khi người lập trình chủ động tạo ra cấu trúc dữ liệu stack đặc dụng cho từng chương trình con đệ quy cụ thể .
  • 103. 3.3 Các trường hợp khử đệ qui đơn giản • A. Đệ qui chỉ có một lệnh gọi trực tiếp • Đệ qui có dạng sau: P(X) ≡ if C(X) then D(X) else begin A(X) ; P(f(X)) ; B(X) ; end ; • X là một bién đơn hoặc biến véc tơ. C(X) là một biểu thức boolean của X . A(X) , B(X) , D(X):không đệ quy f(X) là hàm của X
  • 104. 3.3 Các trường hợp khử đệ qui đơn giản • Tiến trình thực hiện thủ tục P(X) sẻ là : – Nếu C(X) đúng thì thực hiện D(X) . – Còn C(X) sai thì thực hiện • A(X) ; • gọi P(f(X)) ; • thực hiện B(X) . ( B(X) chỉ được thực hiện khi P(f(X)) thực hiện xong ) . • Mỗi lần thành phần đệ quy P(Y) được gọi thì thông tin giải thuật B(Y) lại được sinh ra (nhưng chưa thực hiện ) .
  • 105. 3.3 Các trường hợp khử đệ qui đơn giản • Gỉa sử qúa trình đệ quy kết thúc sau k lần gọi đệ quy – một dãy k thao tác B theo thứ tự : • B(fk-1(X)) , B(fk-2(X)) , . . . ,B(f(f(X))) ,B(f(X)),B(X). • Để thực hiện dãy thao tác { B(fi(X)) } theo thứ tự ngược với thứ tự phát sinh ta cần dãy dữ liệu {fi(X) } truy xuất theo nguyên tắc LIFO. Ta sẻ dùng một Stack để lưu trử dãy { fi(X) } – { X , f(X) , f(f(X)) , . . . , fi(X) , . . . , fk-1(X) }
  • 106. 3.3 Các trường hợp khử đệ qui đơn giản • Trình tự thực hiện P(X) được diễn tả bằng mô hình sau : P(X) C(X) = False A(X) ; Push(S,X); U:=f(X) ; P(U) ; POP(S,U) ; B(U) (U=X) • C(U) = False A(U) ; Push(S,U); U :=f(U)); P(U) ; POP(S,U) ; B(U) ( U = f(X)) • C(U) = False A(U) ; Push(S,U) ; U : = f(U)); P(U ) ; POP(S,U) ; B(U) --------------------------------------------------------------------------------------• C(U) = False A(U) ;------> Push(S,U) ; U : = f(U)); P(U ) ; POP(S,U) ; B(U) ( U=fk-1(X) ) • C(U) = True D(U )
  • 107. 3.3 Các trường hợp khử đệ qui đơn giản • Giải thuật thực hiện P(X) với việc sử dụng Stack có dạng : P(X) ≡{ Creat_Stack (S) ; ( tạo stack S ) While(not(C(X)) do begin A(X) ; Push(S,X) ; ( cất gía trị X vào stack S ) X := f(X) ; end ; D(X) ; While(not(EmptyS(S))) do begin POP(S,X) ; ( lấy dữ liệu từ S ) B(X) ; end ; }
  • 108. 3.3 Các trường hợp khử đệ qui đơn giản • Ví dụ :Thủ tục đệ quy chuyển biểu diễn số từ cơ số thập phân sang nhị phân có dạng : • Binary(m) ≡ if ( m > 0 ) then begin Binary( m div 2 ) ; write( m mod 2 ) ; end; • Trong trường hợp này : X là m . P(X) là Binary(m) . A(X) ; D(X) là lệnh rỗng . B(X) là lệnh Write(m mod 2 ) ; C(X) là ( m <= 0 ) . f(X) = f(m) = m div 2 .
  • 109. 3.3 Các trường hợp khử đệ qui đơn giản • Giái thuật thực hiện Binary(m) không đệ quy là : – Binary (m ) ≡ { Creat_Stack (S) ; While ( m > 0 ) do begin sdu := m mod 2 ; Push(S,sdu) ; m := m div 2 ; end; While( not(EmptyS(S)) do begin POP(S,sdu) ; Write(sdu) ; end; }
  • 110. 3.3 Các trường hợp khử đệ qui đơn giản • B. Thủ tục đệ qui với hai lần gọi đệ qui – Đệ qui có dạng sau P(X) ≡ if C(X) then D(X) else begin A(X) ; P(f(X)) ; B(X) ; P(g(X)) ; end ;
  • 111. 3.3 Các trường hợp khử đệ qui đơn giản • Qúa trình thực hiện thủ tục P(X) sẻ là : – Nếu C(X) đúng thì thực hiện D(X) . – Nếu C(X) sai thì • • • • thực hiện A(X) ; gọi P(f(X)) ; thực hiện B(X) ; gọi P(g(X)) , khi gọi P(g(X)) thì lại – phát sinh lệnh A(g(X)) • Lưu vào stack – fi(X) – gi(X) tương ứng . Khi ta lấy dữ liệu từ stack để thực hiện lệnh B(U) mà chưa gặp điều kiện kết thúc thì ta thực hiện P(g(U)) và lại phải lưu gía trị g(U) vào stack ,... Điều kiện dừng là khi truy xuất tới phần tử lưu đầu tiên trong stack . • Như vậy là ngoài dữ liệu X , con phải lưu vào ngăn xếp thêm thứ tự lần gọi ( cụm gọi )
  • 112. 3.3 Các trường hợp khử đệ qui đơn giản • Thuật toán khử đệ quy tương ứng với thủ tục đệ quy P(X) là :{ Creat_Stack (S) : Push (S, (X,1)) ; Repeat While ( not C(X) ) do begin A(X) ; Push (S, (X,2)) ; X := f(X) ; end ; D(X) ; POP (S, (X,k)) ; if ( k <> 1) then begin B(X) ; X := g(X) ; end ; until ( k = 1 ) ; }
  • 113. 3.3 Các trường hợp khử đệ qui đơn giản • Khử đệ quy thủ tục Tháp Hà Nội . • Dạng đệ qui THN(n , X , Y, Z ) ≡ if( n > 0 ) then begin THN ( n - 1 , X , Z , Y ) ; Move ( X , Z ) ; THN ( n - 1 , Y , X , Z ) ; end ;
  • 114. 3.3 Các trường hợp khử đệ qui đơn giản • Giải thuật không đệ quy tương đương là :{ Creat_Stack (S) ; Push (S ,(n,X,Y,Z,1)) ; Repeat While ( n > 0 ) do begin Push (S ,(n,X,Y,Z,2)) ; n := n - 1 ; Swap (Y,Z ) ; (* Swap(a,b)là thủ tục hoán end ; đổi nội dung 2 biến a ,b *) POP (S,(n,X,Y,Z,k)) ; if ( k <> 1 ) then begin Move (X ,Z ) ; n := n - 1 ; Swap (X ,Y ) ; end ; until ( k = 1 ) ; }