Trích dẫn từ Code Complete 2,Làm thế nào để đệ quy làm cho việc sử dụng bộ nhớ thời gian chạy không thể đoán trước?
int Factorial(int number) { if (number == 1) { return 1; } else { return number * Factorial(number - 1); } }
Ngoài việc là chậm[1] và làm việc sử dụng bộ nhớ thời gian chạy không thể đoán trước[2], phiên bản đệ quy của thói quen này khó khăn hơn để hiểu hơn phiên bản lặp lại, như sau:
int Factorial(int number) { int intermediateResult = 1; for (int factor = 2; factor <= number; factor++) { intermediateResult = intermediateResult * factor; } return intermediateResult; }
Tôi nghĩ phần chậm là do chi phí cuộc gọi hàm không cần thiết.
Nhưng làm cách nào để đệ quy sử dụng bộ nhớ thời gian chạy không thể đoán trước?
Chúng ta không thể dự đoán bao nhiêu bộ nhớ sẽ cần thiết (như chúng ta biết khi nào đệ quy được cho là kết thúc)? Tôi nghĩ rằng nó sẽ không thể dự đoán được như trường hợp lặp lại, nhưng không phải như vậy nữa.
Lưu ý rằng đệ quy CÓ THỂ chạy trong thời gian không đổi NẾU quy trình sử dụng đệ quy đuôi VÀ nếu ngôn ngữ hỗ trợ tối ưu hóa cuộc gọi đuôi. Tra cứu "đệ quy đuôi" nếu bạn quan tâm. – erjiang
Ngoài ra, trên một số CPU như phí gọi hàm Sparc là rất thấp. Và với một số ngôn ngữ lập trình như Tcl, hàm gọi thực sự nhanh hơn mã nội tuyến (do cách hoạt động của bytecompiler). – slebetman