ข้อดีของการเรียกซ้ำคืออะไร
ภาษาการเขียนโปรแกรมบางอย่างสามารถปรับการเรียกซ้ำหางให้เหมาะสม แต่ในแง่ทั่วไปการเรียกซ้ำใช้ทรัพยากรมากกว่าลูปปกติ
เป็นไปได้ไหมที่จะมีฟังก์ชั่นวนซ้ำซ้ำ ๆ ?
ข้อดีของการเรียกซ้ำคืออะไร
ภาษาการเขียนโปรแกรมบางอย่างสามารถปรับการเรียกซ้ำหางให้เหมาะสม แต่ในแง่ทั่วไปการเรียกซ้ำใช้ทรัพยากรมากกว่าลูปปกติ
เป็นไปได้ไหมที่จะมีฟังก์ชั่นวนซ้ำซ้ำ ๆ ?
คำตอบ:
ใช่คุณสามารถโค้ดฟังก์ชั่นวนซ้ำเป็นซ้ำได้ โดยทั่วไปคุณจะต้องรักษาข้อมูลด้วยตนเองมิฉะนั้นจะได้รับการดูแลโดยวิธีการเรียกรหัสที่สร้างโดยคอมไพเลอร์
กล่าวอีกนัยหนึ่งคุณต้องมีสแต็คที่แต่ละรายการเป็นโครงสร้างที่มีพารามิเตอร์ที่ส่งผ่านและตัวแปรท้องถิ่นทั้งหมด คุณทำงานกับรายการที่สูงสุดบนสแต็กเสมอ หากคุณต้องการเรียกตัวเองให้สร้างรายการใหม่และวางซ้อนทับกัน เมื่อเสร็จสิ้นแล้วให้ใช้รายการบนสุดของสแต็กเปิดเผยหนึ่งรายการด้านล่างและใช้รายการบนสุดก่อนหน้านี้เพื่อแยกค่าส่งคืนและอัปเดตรายการสูงสุดใหม่ตามลำดับ
ฉันขอแนะนำให้คุณศึกษาหนังสือคอมไพเลอร์เพื่อดูว่าจะนำไปใช้ในรหัสเครื่องได้อย่างไร
การเรียกซ้ำเป็นวิธีที่เป็นธรรมชาติมากกว่าในการมองสิ่งต่าง ๆ มากกว่าการทำซ้ำ ตัวอย่างเช่นพิจารณาการข้ามผ่านของต้นไม้ไบนารี: inorder(left); process(); inorder(right);
ง่ายกว่าการดูแลสแต็กอย่างชัดเจน
ตราบใดที่คุณไม่ลึกเกินไป (การสแต็กสแต็ก) ความแตกต่างในการใช้ทรัพยากรมักเป็นเรื่องเล็กน้อย ไม่ต้องกังวลเกี่ยวกับเรื่องนี้โดยทั่วไป ปกติแล้วรหัสธรรมดานั้นง่ายกว่าโค้ดที่ปรับปรุงด้วยมือถึงแม้ว่าจะมีข้อยกเว้นก็ตาม ปกติแล้วดีกว่าเร็วกว่า
อัลกอริทึมแบบเรียกซ้ำใด ๆ สามารถแสดงเป็นอัลกอริทึมแบบวนซ้ำได้ แต่คุณอาจต้องเก็บสแต็คอย่างชัดเจน (ตรงกับสแต็กการโทรที่จัดการโดยปริยาย) ท้ายที่สุดถ้าคุณรวบรวมฟังก์ชั่นวนซ้ำคุณจะได้รับบางสิ่งบางอย่างที่อาศัยการจัดการกองซ้อนและวนรอบฟังก์ชันและนั่นเป็นการวนซ้ำ
ฟังก์ชั่น tail-recursive สามารถแปลเป็นลูปได้ง่ายและไม่ต้องการสแต็ก แต่เป็นกรณีพิเศษ
ข้อดีของการเรียกซ้ำคืออะไร
ลองแก้ปัญหาหอคอยแห่งฮานอยซ้ำ ๆ เมื่อคุณยอมแพ้ให้ดูที่วิธีแก้ปัญหาซ้ำแล้วเปรียบเทียบกับโซลูชันแบบเรียกซ้ำ อันไหนง่ายกว่ากัน?
เป็นไปได้ไหมที่จะมีฟังก์ชั่นวนซ้ำซ้ำ ๆ ?
ใช่ในหลักการ อย่างไรก็ตามสำหรับปัญหามากมายรวมถึงงานทั่วไปเช่นการสำรวจเส้นทางต้นไม้การแก้ปัญหาแบบเรียกซ้ำนั้นง่ายกว่าและสวยงามกว่าแบบวนซ้ำ
ข้อดีของการเรียกซ้ำคืออะไร
ความง่าย แน่นอนว่าการใช้ tail-call optimization นั้นจะใช้ทรัพยากรมากขึ้น (stack) แต่คุณจะใช้งานอย่างไรdeltree
ใน Java โดยไม่มีการเรียกซ้ำ การบิดคือการที่delete()
สามารถลบไดเร็กตอรี่ต่อเมื่อมันว่างเปล่า; ที่นี่ด้วยการสอบถามซ้ำ:
deltree(File fileOrDirectory) {
if (fileOrDirectory.isDirectory()) {
for (File subFileOrDirectory : fileOrDirectory.listFiles()) {
deltree(subFileOrDirectory);
}
}
fileOrDirectory.delete();
}
ฉันเชื่อว่าการเรียกซ้ำเป็นหนึ่งในเครื่องมือเหล่านั้นที่โปรแกรมเมอร์ต้องมีชีวิตอยู่ ด้วยการเรียกซ้ำคุณสามารถ "คิด" อัลกอริทึมของคุณและแก้ไขมันได้อย่างที่คุณคิด แต่ฉันต้องเตือนคุณทุกคนกำลังพูดถึงว่าการเรียกซ้ำเป็นอย่างไรและความเรียบง่ายเพียงใดที่นำมาซึ่งรหัสเกี่ยวกับว่าฉันมีบางสิ่งที่จะพูด:
มีสิ่งเหล่านั้นในใจเรียนรู้การเรียกซ้ำ มันตลกซับซ้อนและมันจะทำให้สมองคุณแตก แต่คุณจะพบว่าตัวเองรักมัน
ขอให้โชคดี!