Khi truyền tham số trong Pascal, đòi hỏi phải có sự tương ứng về
tên của kiểu dữ liệu của các tham số hình thức và tham số thực. Một số định
nghĩa và qui tắc về truyền tham số trong Pascal:
- Những tham số hình thức nằm sau từ khóa VAR gọi là tham số biến
(variable parameter). Với tham số biến, các tham số thực bắt buộc phải là biến
chứ không được là giá trị. Khi giá trị của tham số biến thay đổi thì nó sẽ làm
thay đổi giá trị của tham số thực tương ứng và khi ra khỏi chương
trình con đó, tham số thực vẫn giữ giá trị đã được thay đổi
đó.
- Những tham số hình thức không đứng sau từ khóa VAR gọi là tham
số trị (value parameter), khi đó các tham số thực có thể là một biến, một biểu
thức, một hằng, hoặc một giá trị số. Các tham số trị nhận giá trị từ tham số thực
khi truyền như là giá trị ban đầu, khi giá trị của tham số trị thay đổi thì nó
sẽ không làm thay đổi giá trị của tham số thực, nghĩa là giá trị của tham số
thực sau khi thoát khỏi chương trình con vẫn luôn bằng với giá trị của tham số
thực trước khi truyền đến chương trình con đó. Do vậy một tham trị
không bao giờ là kết quả tính toán của chương trình con.
Một vài thí dụ về tham
số biến:
Ví dụ 7.7: Viết chương trình tính lập phương. PROGRAM Parameter1; VAR num: integer; {num là biến toàn cục} PROCEDURE LapPhuong(var a:integer); {a là một tham số biến} Begin a:=a*a*a; End; Begin write('Nhập số cần tính lập phương num = '); readln(num); LapPhuong(num); {tham số thực num được truyền cho tham số biến a} writeln('Lập phương của số vừa nhập =' , num); readln; End. Ví dụ 7.8: PROGRAM parameter2; VAR a, b : integer ; {biến toàn cục } PROCEDURE thamso (x : integer ; VAR y : integer ) ; BEGIN { x: là tham số trị , còn y là tham số biến} x := x + 1 ; y := y + 1 ; Writeln (‘Trong procedure thamso, ... ‘) ; Writeln (' Hai số của bạn là a = , x : 3, và b = , y : 3 ) ; END ; BEGIN Write (' Nhập vào 2 trị số nguyên a, b : ') ; Readln (a, b) ; Writeln (' Ban đầu, Bạn đã nhập vào a =' , a : 3, 'và b =' , b : 3 ) ; thamso (a, b) ; {tham số thực a truyền cho tham số trị x tham số thực b truyền cho tham số biến y } Writeln (' Ngoài procedure thamso, ... '); Writeln (' Hiện nay, số a là , a : 3, và b là , b : 3 ') ; Writeln (' Ta thấy, a không đổi và b thay đổi ! ') ; Readln; END.
Một chương trình con mà trong quá trình thiết lập, nó sẽ gọi chính
bản thân nó thì chương trình con có tính đệ qui (recursion).
Ví dụ 7.9: Bài toán tính giai thừa (factorials) theo cách đệ qui. Bài toán này có phần chương trình chính giống như đã có ở ví dụ trước: PROGRAM Giaithua ; (*Tính giai thừa của số n theo phương pháp đệ qui *) VAR x : integer ; FUNCTION factorial (n : integer) : longint ; BEGIN IF n <= 1 THEN factorial := 1 {điều kiện neo} ELSE factorial := n * factorial (n -1); END ; BEGIN Write (' Nhập vào một số nguyên dương x = '); Readln (x) ; Writeln ; Writeln (' Kết quả ',x,'! = , factorial(x)); Readln; END.Giả sử ta nhập x = 4, thì 4! = factorial(n), với n = 4, ta có sơ đồ minh họa như sau:Chú ý:- Ưu điểm của thuật toán đệ qui là ngắn gọn. Nó có khả năng định nghĩa một tập hợp rất lớn các đối tượng bằng một số các câu lệnh hữu hạn. Thuật toán đệ qui có vẻ thích hợp cho các bài toán mà tự thân cấu trúc dữ liệu của nó đã được định nghĩa theo lối đệ qui.- Có một số thuật toán đệ qui sử dụng cho các bài toán đơn giản có thể được thay thế bằng một thuật toán khác không tự gọi chúng, sự thay thế đó được gọi là khử đệ qui.- Trong một số bài toán ta có thể giải theo 2 cách: thuật toán lặp (xem chương trước) và thuật toán đệ qui. Thông thường, cách giải theo thuật toán lặp (WHILE .. DO) thì tốt hơn so với thuật toán đệ qui vì đệ qui đòi hỏi thêm bộ nhớ và thời gian. Khi đó các thanh ghi được sử dụng cho lưu trữ và khi quay trở về phải khôi phục lại trạng thái cũ trong mỗi lần gọi đến chương trình con. Mức độ phức tạp có thể gia tăng khi trong chương trình con theo thuật toán đệ qui có chứa những chương trình con khác. Vì vậy, khi dùng đệ qui ta cần thận trọng, nhất là thuật toán này thường không cho ta thấy rõ trực tiếp toàn bộ quá trình giải các bước. Nói chung, chỉ khi naò không thể dùng thuật toán lặp ta mới nên sử dụng thuật toán đệ qui.

Không có nhận xét nào:
Đăng nhận xét