Khi viết hàm kiểu đệ quy, nếu gọi đệ quy quá nhiều lần sẽ bị tràn stack và dẫn đến kết quả trả về sai(thậm chí là crash chương trình). Số lần tối đa gọi đệ quy phụ thuộc vào độ lớn của stack. Trong Unix/Linux, có thể sử dụng lệnh ulimit -a trong terminal để xem stack mà OS cấp cho người dùng là bao nhiêu.(có thể thay đổi được size stack!)
VD:
hvnsweeting@HVNBBZ:~$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) 16382
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192 => 8 MB
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
VD với hàm tính giai thừa viết theo kiểu đệ quy bình thường, khi gọi để tính factorial(1000) đã báo max recursive depth exceeds (trong Python)
Vậy khi viết chương trình, nên tránh viết dưới kiểu đệ quy mà hãy viết theo kiểu tuyến tính để tránh lỗi này xảy ra hoặc chỉ viết đệ quy cho các hàm gọi ít lần.
1 comment:
chuẩn đấy =))
Post a Comment