ฟังก์ชันเรียกซ้ำเป็นฟังก์ชันที่เรียกด้วยตัวเอง
มันช่วยให้โปรแกรมเมอร์เขียนโปรแกรมที่มีประสิทธิภาพโดยใช้จำนวนน้อยที่สุดของรหัส
ข้อเสียคือว่าพวกเขาสามารถทำให้เกิดลูปไม่มีที่สิ้นสุดและผลที่ไม่คาดคิดอื่น ๆ หากไม่ได้เขียนอย่างถูกต้อง
ฉันจะอธิบายทั้งฟังก์ชัน Simple Recursive และฟังก์ชัน Tail Recursive
เพื่อเขียนฟังก์ชันเรียกซ้ำแบบง่าย
- จุดแรกที่ต้องพิจารณาคือเมื่อไหร่ที่คุณควรตัดสินใจออกจากลูปซึ่งเป็นลูป if
- ประการที่สองคือกระบวนการที่จะทำถ้าเราเป็นหน้าที่ของเราเอง
จากตัวอย่างที่กำหนด:
public static int fact(int n){
if(n <=1)
return 1;
else
return n * fact(n-1);
}
จากตัวอย่างข้างต้น
if(n <=1)
return 1;
เป็นปัจจัยในการตัดสินใจเมื่อออกจากลูป
else
return n * fact(n-1);
คือการประมวลผลจริงที่ต้องทำ
ขอแบ่งงานทีละอย่างเพื่อให้เข้าใจง่าย
ให้เราดูว่าจะเกิดอะไรขึ้นภายในถ้าฉันวิ่ง fact(4)
- การแทนที่ n = 4
public static int fact(4){
if(4 <=1)
return 1;
else
return 4 * fact(4-1);
}
If
ลูปล้มเหลวดังนั้นมันelse
จึงวนซ้ำเพื่อให้มันกลับมา4 * fact(3)
ในหน่วยความจำแบบสแต็กเรามี 4 * fact(3)
การแทนที่ n = 3
public static int fact(3){
if(3 <=1)
return 1;
else
return 3 * fact(3-1);
}
If
ลูปล้มเหลวดังนั้นจึงไปelse
ลูป
ดังนั้นมันจึงกลับมา 3 * fact(2)
จำไว้ว่าเราเรียกว่า `` 4 * fact (3) ''
ผลลัพธ์สำหรับ fact(3) = 3 * fact(2)
จนถึงตอนนี้สแต็คมี 4 * fact(3) = 4 * 3 * fact(2)
ในหน่วยความจำแบบสแต็กเรามี 4 * 3 * fact(2)
การแทนที่ n = 2
public static int fact(2){
if(2 <=1)
return 1;
else
return 2 * fact(2-1);
}
If
ลูปล้มเหลวดังนั้นจึงไปelse
ลูป
ดังนั้นมันจึงกลับมา 2 * fact(1)
จำเราโทร 4 * 3 * fact(2)
ผลลัพธ์สำหรับ fact(2) = 2 * fact(1)
จนถึงตอนนี้สแต็คมี 4 * 3 * fact(2) = 4 * 3 * 2 * fact(1)
ในหน่วยความจำแบบสแต็กเรามี 4 * 3 * 2 * fact(1)
การแทนที่ n = 1
public static int fact(1){
if(1 <=1)
return 1;
else
return 1 * fact(1-1);
}
If
ห่วงเป็นจริง
ดังนั้นมันจึงกลับมา 1
จำเราโทร 4 * 3 * 2 * fact(1)
ผลลัพธ์สำหรับ fact(1) = 1
จนถึงตอนนี้สแต็คมี 4 * 3 * 2 * fact(1) = 4 * 3 * 2 * 1
สุดท้ายผลลัพธ์ของfact (4) = 4 * 3 * 2 * 1 = 24
Recursion หางจะเป็น
public static int fact(x, running_total=1) {
if (x==1) {
return running_total;
} else {
return fact(x-1, running_total*x);
}
}
- การแทนที่ 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
ลูปล้มเหลวดังนั้นมันelse
จึงวนซ้ำเพื่อให้มันกลับมาfact(3, 4)
ในหน่วยความจำแบบสแต็กเรามี fact(3, 4)
การแทนที่ n = 3
public static int fact(3, running_total=4) {
if (x==1) {
return running_total;
} else {
return fact(3-1, 4*3);
}
}
If
ลูปล้มเหลวดังนั้นจึงไปelse
ลูป
ดังนั้นมันจึงกลับมา fact(2, 12)
ในหน่วยความจำแบบสแต็กเรามี fact(2, 12)
การแทนที่ n = 2
public static int fact(2, running_total=12) {
if (x==1) {
return running_total;
} else {
return fact(2-1, 12*2);
}
}
If
ลูปล้มเหลวดังนั้นจึงไปelse
ลูป
ดังนั้นมันจึงกลับมา fact(1, 24)
ในหน่วยความจำแบบสแต็กเรามี fact(1, 24)
การแทนที่ n = 1
public static int fact(1, running_total=24) {
if (x==1) {
return running_total;
} else {
return fact(1-1, 24*1);
}
}
If
ห่วงเป็นจริง
ดังนั้นมันจึงกลับมา running_total
ผลลัพธ์สำหรับ running_total = 24
สุดท้ายผลลัพธ์ของfact (4,1) = 24