Chương 3
Hàm (Function)
Lập trình đơn thể
M
ỗ
i module có d
ữ
li
ệ
u riêng
độ
c l
ậ
p v
ớ
i module khác
Main Program(Also a module)
Data
Module
1
+
Data Data
1
Procedure
1
Module
2
+
Data Data
2
/* các khai báo cục bộ */
/* các câu lệnh */
[return <Exp>;] /* có thể có hoặc không*/
}
Cú pháp của hàm (tt)
Ví d
ụ
1:
void chao()
{
printf(“\nxin chao”);
}
Ví d
ụ
2:
int tong(int n)
{
int i,t=0;
for(i=1;i<=n;++i)t=t+i;
return t;
}
Cú pháp của hàm (tt)
Ví dụ 3:
int ucln(int x, int y)
{
while(x*y)
if(x>y)x=x%y;
else y=y%x;
cho tham số hình thức
6 8
a b
6 8
x y
kq
Các bước thực hiện lời gọi hàm (tt)
B4: Thực hiện các câu lệnh trong thân
hàm.
6 8
a b
0 2
x y
kq
Các bước thực hiện lời gọi hàm (tt)
B5: Trả lại kết quả bởi lệnh return.
6 8
a b
0 2
x y
kq
2
Các bước thực hiện lời gọi hàm (tt)
B6: Giải phóng các
vùng nhớ đã cấp phát
ở B2, lấy địa chỉ đã
lưu ở B1 thực hiện
tiếp chương trình.
6 8
a b
ế
n bình th
ườ
ng.
Dùng d
ạ
ng khai báo *<tên_ct>, cho k
ế
t qu
ả
là d
ữ
li
ệ
u
mà con tr
ỏ đang
“tr
ỏ
” t
ớ
i.
Có th
ể
dùng các phép toán
đố
i v
ớ
phải là một con trỏ).
Truyền địa chỉ
Ví dụ:
void hoan_vi(int *x, int *y)
{
int t=*x;
*x=*y;
*y=t;
}
Giả sử int a,b là các biến toàn cục và a=5; b=7;
Xét lời gọi hàm: hoan_vi(&a,&b); khi đó:
Truyền địa chỉ (tt)
8 6
a b
&a &b
x y
6
t
6 8
a b
x y t
Hàm đệ quy
Đối tượng đệ quy: là đối tượng được xây
dựng thông qua chính nó. (đối tượng có
thể là: bài toán, hàm, kiểu dữ liệu )
Ví dụ: xét bài toán P(n) = 1+2+ +n. Bài
toán này có lời giải (đệ quy như sau):
int F(int n)
{
if(n==1||n==2) return 1;
else return F(n-1)+F(n-2);
}
Phân tích hàm đệ quy
Xét lời gọi hàm
t=F(4);
Số hàm được gọi
chính là số nút trên
cây.
Do đó với kích thước
tham số lớn hàm đệ
quy tiêu tốn nhiều
thời gian và bộ nhớ.
t=F(4)
F(3) F(2)
F(2)
F(1)
+
||
1
||
1
||
1
+