Hàm đệ quy là một hàm tự gọi
Nó cho phép các lập trình viên viết các chương trình hiệu quả bằng cách sử dụng một lượng mã tối thiểu .
Mặt hạn chế là chúng có thể gây ra vòng lặp vô hạn và các kết quả không mong muốn khác nếu không được viết đúng cách .
Tôi sẽ giải thích cả hàm đệ quy đơn giản và hàm đệ quy đuôi
Để viết một hàm đệ quy đơn giản
- Điểm đầu tiên cần xem xét là khi nào bạn nên quyết định thoát ra khỏi vòng lặp, đó là vòng lặp if
- Thứ hai là quy trình phải làm nếu chúng ta là chức năng của chính mình
Từ ví dụ đã cho:
public static int fact(int n){
if(n <=1)
return 1;
else
return n * fact(n-1);
}
Từ ví dụ trên
if(n <=1)
return 1;
Là yếu tố quyết định khi nào thoát khỏi vòng lặp
else
return n * fact(n-1);
Quá trình xử lý thực sự được thực hiện
Hãy để tôi chia nhỏ nhiệm vụ từng cái một cho dễ hiểu.
Hãy để chúng tôi xem điều gì xảy ra trong nội bộ nếu tôi chạy fact(4)
- Thay n = 4
public static int fact(4){
if(4 <=1)
return 1;
else
return 4 * fact(4-1);
}
If
vòng lặp không thành công vì vậy nó đi đến else
vòng lặp để nó trả về4 * fact(3)
Trong bộ nhớ ngăn xếp, chúng ta có 4 * fact(3)
Thay n = 3
public static int fact(3){
if(3 <=1)
return 1;
else
return 3 * fact(3-1);
}
If
vòng lặp không thành công vì vậy nó đi đến else
vòng lặp
vì vậy nó trở lại 3 * fact(2)
Hãy nhớ rằng chúng tôi gọi là `` 4 * fact (3) ''
Đầu ra cho fact(3) = 3 * fact(2)
Cho đến nay ngăn xếp đã 4 * fact(3) = 4 * 3 * fact(2)
Trong bộ nhớ ngăn xếp, chúng ta có 4 * 3 * fact(2)
Thay n = 2
public static int fact(2){
if(2 <=1)
return 1;
else
return 2 * fact(2-1);
}
If
vòng lặp không thành công nên nó đi đến else
vòng lặp
vì vậy nó trở lại 2 * fact(1)
Hãy nhớ rằng chúng tôi đã gọi 4 * 3 * fact(2)
Đầu ra cho fact(2) = 2 * fact(1)
Cho đến nay ngăn xếp đã 4 * 3 * fact(2) = 4 * 3 * 2 * fact(1)
Trong bộ nhớ ngăn xếp, chúng ta có 4 * 3 * 2 * fact(1)
Thay n = 1
public static int fact(1){
if(1 <=1)
return 1;
else
return 1 * fact(1-1);
}
If
vòng lặp là đúng
vì vậy nó trở lại 1
Hãy nhớ rằng chúng tôi đã gọi 4 * 3 * 2 * fact(1)
Đầu ra cho fact(1) = 1
Cho đến nay ngăn xếp đã 4 * 3 * 2 * fact(1) = 4 * 3 * 2 * 1
Cuối cùng, kết quả của fact (4) = 4 * 3 * 2 * 1 = 24
Các Đệ quy Tail sẽ
public static int fact(x, running_total=1) {
if (x==1) {
return running_total;
} else {
return fact(x-1, running_total*x);
}
}
- Thay n = 4
public static int fact(4, running_total=1) {
if (x==1) {
return running_total;
} else {
return fact(4-1, running_total*4);
}
}
If
vòng lặp không thành công vì vậy nó đi đến else
vòng lặp để nó trả vềfact(3, 4)
Trong bộ nhớ ngăn xếp, chúng ta có fact(3, 4)
Thay n = 3
public static int fact(3, running_total=4) {
if (x==1) {
return running_total;
} else {
return fact(3-1, 4*3);
}
}
If
vòng lặp không thành công nên nó đi đến else
vòng lặp
vì vậy nó trở lại fact(2, 12)
Trong bộ nhớ ngăn xếp, chúng ta có fact(2, 12)
Thay n = 2
public static int fact(2, running_total=12) {
if (x==1) {
return running_total;
} else {
return fact(2-1, 12*2);
}
}
If
vòng lặp không thành công nên nó đi đến else
vòng lặp
vì vậy nó trở lại fact(1, 24)
Trong bộ nhớ ngăn xếp, chúng ta có fact(1, 24)
Thay n = 1
public static int fact(1, running_total=24) {
if (x==1) {
return running_total;
} else {
return fact(1-1, 24*1);
}
}
If
vòng lặp là đúng
vì vậy nó trở lại running_total
Đầu ra cho running_total = 24
Cuối cùng, kết quả của fact (4,1) = 24