Tags:

โค้ดนี้เป็นโค้ดของภาษา java นะครับ
public static void cal1 (int n) {
if (n == 0) return;
system.out.println(n);
cal1(n-1);
system.out.println(")" + n);
}

โดยส่งค่าไปที่ cal1(3) ครับและสั่งให้แสดงผล
ผลที่ได้จากการแสดงก็คือ
3
2
1
)1
)2
)3
อยากรบกวนช่วยอธิบายการทำงานของฟังก์ชั่นนี้หน่อย
ครับ ทำไมพอ return แล้วถึงกลับมาเป็น
)1
)2
)3
อีกรอบนึง

อีกอันนึงนะครับ
public static void main(string[]args){
system.out.println(sum(10));
}
public static void sum5 (int n) {
if (n == 0) return 0;
return sum5(n - 1)+n
}
แล้วได้ค่าเป็น 55 ครับอยากทราบว่าการทำงานของฟังก์ชั่นนี้นำค่า n ไปเก็บเซฟไว้ที่ตัวแปรไหนครับในส่วนของ
การเรียกใช้ฟังก์ชั่นครับทำไมจู่ๆค่าที่ได้ถึงเป็น 55 ตอนนี้งงจริงๆ จนปัญญาแล้วครับ
ขอบคุณล่วงหน้าสำหรับทุกคำตอบครับ

Get latest news from Blognone
By: JavaDevil
iPhoneUbuntuIn Love
on 25 August 2015 - 23:08 #837400

มันเป็น method แบบ recursive มันจะต้องทำงานไปเรื่อยๆ จนกว่าจะจบครับ แล้วมันถึงจะ return ย้อนกลับ
ตัวอย่าง sum(3) ก็พอน๊อ เดียวยาว
sum(3) n > 0, จากนั้น return sum(2) + 3 << ตัวนี้จะต้องเป็นตัวที่ return แต่ๆ sum(2) ยังไม่ถูกแก้เพราะฉนั้น มันจะทดไว้ก่อนใน stack ไปเรียก
sum(2), n > 0 จากนั้น return sum(1) + 2 << เหมือนเดิม ต้องแก้ sum(1) ก่อน ยัดไว้ใน stack อีกตามเคย ไปเรียก
sum(1), n > 0, จากนั้น return sum(0) + 1 << อีกตามเคย sum(0) มันคืออะไรๆๆ เอาไปฝากไว้กับเธอ
sum(0),n = 0 ก็ return 0 สินะ
เสร็จก็ไปเอา ที่ฝากไว้กลับมา sum(0) + 1 = 0 +1 = 1 จบ return 1 ไป
ไปเรียกตัวต่อไปอีก sum(1)+2 = 1 + 2 = 3 จบๆๆ return 3
หมดยัง ไม่หมดจัดต่อ sum(2) +3 = 3+3 = 6 return 6
หมดยัง หมดแล้วนิ ^3^ จบข่าว return สุดท้าย คือ 6

ช้อด้านบนก็เหมือนกันครับ ต้องหัดไล่ไปทีละ step
** recursive อาจจะดูยากๆ แต่พอเข้าใจแล้วจะสนุกสนาน แก้ปัญหา ได้หลายๆอย่าง

By: kswisit
ContributoriPhoneAndroidIn Love
on 26 August 2015 - 08:45 #837461

อยากรบกวนช่วยอธิบายการทำงานของฟังก์ชั่นนี้หน่อย
ครับ ทำไมพอ return แล้วถึงกลับมาเป็น
)1
)2
)3
อีกรอบนึง

เพราะมันติดทำงาน cal1(n-1); อยู่
มันจะ exec system.out.println(")" + n); หลังจากที่ return ออกจาก cal1(n-1); แล้ว ตามด้านบนอธิบาย

แนะนำให้ set breakpoint แล้ว debug step ๆ ทีละบันทัดดูครับ


^
^
that's just my two cents.

By: bluesword on 26 August 2015 - 15:48 #837584

[Q]อยากทราบว่าการทำงานของฟังก์ชั่นนี้นำค่า n ไปเก็บเซฟไว้ที่ตัวแปรไหนครับในส่วนของ
การเรียกใช้ฟังก์ชั่นครับ
[A]ค่าที่ได้จะเก็บไว้ใน stack ,ควรระวังในการเรียกใช้ recursive function เพราะออกเกิด stack overflow ได้

By: EThaiZone
ContributorAndroidUbuntuWindows
on 28 August 2015 - 21:10 #838322
EThaiZone's picture

cal1(n-1);
บรรทัดนี้ค่า n ถูกหักลบแล้วส่งเข้าไป

แต่ไม่ได้หมายความว่าค่า n มันเปลี่ยนไป ดังนั้น
system.out.println(")" + n);

จะยังมีค่า n เท่าเดิมในตอนส่งเข้ามา

พูดง่ายๆ โค้ดทำให้มองว่าค่า n ถูกลดทีล่ะ 1 (ถ้าอ่านด้วยตาจะโดนหลอก)

ในความเป็นจริงค่า n ไม่ได้ลดลงเลย แต่ทุกครั้งที่มีการเรียก cal1 ซ้อนเข้าไป ตัวแปรใหม่ที่ถูกส่งเข้าไปมันจะน้อยกว่า n ลงไปทีล่ะ 1 และโค้ดจะหยุดเมื่อค่าที่รับเข้ามากลายเป็น 0

จากนั้นมันก็เริ่มคืนค่า และทำการแสดง )n ออกมา ซึ่งมันจะเหมือนทำย้อนกลับ มันเลยแสดง )1 )2 )3 ครับ

ถ้าไม่ debug เป็นระยะ ก็แนะนำให้เขียน flow ลงกระดาษดูครับ


มันไม่ง่ายเลยที่จะทำ GIF ให้มีขนาดน้อยกว่า 20kB

By: EThaiZone
ContributorAndroidUbuntuWindows
on 28 August 2015 - 18:16 #838323
EThaiZone's picture

ส่วนโจทย์สอง อันนี้คือมันทำงานแบบ recursive แบบเหมือนข้อแรกนั้นล่ะ

ค่าส่ง 10 เข้าไป มันจะโดนหักลบ 1 แล้ว recursive ไปเรื่อยๆ จบกระทั่งในรอบที่ 11 (10 ถึง 0 โดยทำงาน 11 ครั้ง) ค่าจะกลายเป็น 0 แล้วถูก return กลับมา

ทุกๆ รอบ return กลับมาจะถูกบวกด้วย 5 เมื่อคืนพ้น recursive ครบจำนวน 11 ครั้ง มันก็เลยออกเป็น 55 ครับ

เก็ทไหม?


มันไม่ง่ายเลยที่จะทำ GIF ให้มีขนาดน้อยกว่า 20kB