Tại mỗi thời điểm của hàm đệ quy được đặc trưng bởi: nội dung các biến và các lệnh cần thực hiện tiếp theo. Do đĩ tại mỗi thời điểm trong tiến trình xử lý của hàm đệ quy cần phải lưu trữ cả các trạng thái xử lý dang dở.
Ví dụ trong hàm đệ quy tính giai thừa n,
GT(n):
if (n == 0) return 1; else return (n* GT(n-1));
Trong trường hợp n = 3
Hình 2.7: Gọi đệ quy hàm GT.
Khi thực hiện lời gọi GT(3) thì sẽ phát sinh lời gọi hàm đến GT(2) và đồng thời phải lưu giữ thơng tin trạng thái xử lý cịn dang dở GT(3) = 3 * GT(2). Đến lượt hàm GT(2) sẽ phát sinh lời gọi hàm đến GT(1) và lưu giữ thơng tin trạng thái cịn dang dở GT(2) = 2 * GT(1)…Quá trình cứ thực hiện tương tự cho tới khi gặp trường hợp suy biến GT(0) = 1.
GT(3) = 3 * GT(2)
GT(2) = 2 * GT(1)
GT(1) = 1 * GT(0)
Kết thúc quá trình gọi đệ quy là quá trình xử lý ngược được thực hiện: Giá trị của GT(0) được dùng để tính GT(1) theo quá trình lưu trữ Dùng giá trị GT(1) để tính GT(2) theo quá trình tương tự
Dùng giá trị GT(2) để tính GT(3) để ra kết quả cuối cùng
Song song với quá trình xử lý ngược là xĩa bỏ thơng tin lưu trữ trong những lần gọi hàm tương ứng.
Ví dụ hàm đệ quy tính giá trị dãy Fibonacci
Fibo(n)
if (n ==0) || (n == 1) return 1; else
return (Fibo(n-1) + Fibo(n-2));
Hình 2.8: Hàm đệ quy tính dãy Fibonacci.
Do đặc điểm của quá trình xử lý một hàm đệ quy: việc thực thi 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, do đĩ cần phải cĩ cơ chế lưu trữ thơng tin thoả yêu cầu:
o Ở mỗi lần gọi phải lưu trữ thơng tin trạng thái con cịn đang xử lý dang dở, số trạng thái này bằng với số lần gọi chưa hồn tất.
o Sau khi thực hiện xong một lần gọi thứ k, cần khơi phục lại tồn bộ thơng
Fibo(4) = Fibo(2) + Fibo(3)
Fibo(2) = Fibo(1) + Fibo(0) Fibo(3) = Fibo(2) + Fibo(1)
Fibo(1) = 1 Fibo(0) = 1
Fibo(2) = Fibo(1) + Fibo(0) Fibo(1) = 1
o Lệnh gọi cuối cùng (trường hợp suy biến) sẽ được hồn tất trước tiên. Các lệnh gọi sau sẽ hồn thành trước, do đĩ dãy thơng tin trạng thái được hồi phục theo thứ tự ngược với thứ tự lưu trữ.
Cấu trúc dữ liệu ngăn xếp lưu trữ theo kiểu Last In First Out thoả các yêu cầu trên nên được sử dụng để lưu trữ thơng tin trạng thái của quá trình xử lý đệ quy.
Thơng thường đệ quy là phương pháp giúp chúng ta tìm giải thuật cho những bài tốn khĩ. Kết quả của giải thuật đệ quy thường rất gọn gàng, dễ hiểu và dễ chuyển thành các chương trình trên các ngơn ngữ lập trình. Tuy nhiên, việc xử lý giải thuật đệ quy cũng gây khĩ khăn cho máy về khơng gian lưu trữ và thời gian xử lý. Vì vậy việc thay thế một chương trình đệ quy bằng một chương trình khơng đệ quy cũng được quan tâm rất nhiều.
Thơng thường khi gặp một bài tốn khĩ giải quyết theo hướng khơng đệ quy thì người ta thực hiện quá trình như sau:
o Dùng quan niệm đệ quy để tìm giải thuật cho bài tốn o Mã hố giải thuật đệ quy
o Khử đệ quy để cĩ một chương trình khơng đệ quy.
Quá trình trên gọi là khử đệ quy, đơi khi việc khử đệ quy cũng khơng dễ dàng gì, nên nhiều khi cũng phải chấp nhận chương trình đệ quy!