เพื่อตอบคำถามเฉพาะของคุณ: ไม่จากมุมมองของการเรียนรู้ภาษาการเรียกซ้ำไม่ใช่คุณลักษณะ ถ้าอาจารย์ของคุณเทียบเคียงคุณทำเครื่องหมายว่าใช้ "คุณลักษณะ" ที่เขายังไม่เคยสอนนั่นเป็นสิ่งที่ผิด
การอ่านระหว่างบรรทัดความเป็นไปได้อย่างหนึ่งคือการใช้การเรียกซ้ำคุณหลีกเลี่ยงที่จะใช้คุณลักษณะที่ควรจะเป็นผลการเรียนรู้สำหรับหลักสูตรของเขา ตัวอย่างเช่นคุณอาจไม่ได้ใช้การวนซ้ำเลยหรือบางทีคุณอาจใช้แค่การวนซ้ำfor
แทนที่จะใช้ทั้งสองfor
และwhile
และเป็นเรื่องปกติที่งานมอบหมายมีจุดมุ่งหมายเพื่อทดสอบความสามารถของคุณในการทำบางสิ่งและหากคุณหลีกเลี่ยงที่จะทำศาสตราจารย์ของคุณก็ไม่สามารถให้คะแนนที่กำหนดไว้สำหรับคุณลักษณะนั้นแก่คุณได้ อย่างไรก็ตามหากนั่นเป็นสาเหตุของการทำเครื่องหมายที่หายไปจริงๆอาจารย์ควรถือเอาสิ่งนี้เป็นประสบการณ์การเรียนรู้ของตนเองหากการแสดงให้เห็นว่าผลการเรียนรู้บางอย่างเป็นหนึ่งในเกณฑ์สำหรับงานที่มอบหมายซึ่งควรอธิบายให้นักเรียนทราบอย่างชัดเจน .
ต้องบอกว่าฉันเห็นด้วยกับความคิดเห็นและคำตอบอื่น ๆ ส่วนใหญ่ที่ว่าการทำซ้ำเป็นทางเลือกที่ดีกว่าการเรียกซ้ำที่นี่ มีสาเหตุสองประการและในขณะที่คนอื่น ๆ ได้สัมผัสกับพวกเขาในระดับหนึ่งฉันไม่แน่ใจว่าพวกเขาอธิบายความคิดเบื้องหลังพวกเขาอย่างครบถ้วน
กองซ้อนล้น
สิ่งที่ชัดเจนกว่าคือคุณเสี่ยงที่จะได้รับข้อผิดพลาดสแตกล้น ตามความเป็นจริงแล้ววิธีการที่คุณเขียนนั้นไม่น่าจะนำไปสู่วิธีการหนึ่งอย่างแท้จริงเนื่องจากผู้ใช้จะต้องป้อนข้อมูลที่ไม่ถูกต้องหลาย ๆ ครั้งจึงจะทริกเกอร์สแตกล้นได้
อย่างไรก็ตามสิ่งหนึ่งที่ต้องจำไว้ก็คือไม่ใช่แค่วิธีการเท่านั้น แต่วิธีอื่น ๆ ที่สูงกว่าหรือต่ำกว่าในห่วงโซ่การโทรจะอยู่ในสแต็ก ด้วยเหตุนี้การกลืนพื้นที่สแต็กที่มีอยู่โดยไม่ตั้งใจจึงเป็นสิ่งที่ไม่สุภาพสำหรับวิธีการใด ๆ ไม่มีใครต้องการที่จะต้องกังวลเกี่ยวกับพื้นที่สแต็กที่ว่างอยู่ตลอดเวลาเมื่อใดก็ตามที่พวกเขาเขียนโค้ดเนื่องจากความเสี่ยงที่โค้ดอื่น ๆ อาจใช้มันไปมากโดยไม่จำเป็น
นี่เป็นส่วนหนึ่งของหลักการทั่วไปในการออกแบบซอฟต์แวร์ที่เรียกว่านามธรรม โดยพื้นฐานแล้วเมื่อคุณโทรDoThing()
สิ่งที่คุณควรต้องใส่ใจก็คือสิ่งที่ทำเสร็จแล้ว คุณไม่ต้องกังวลเกี่ยวกับรายละเอียดการใช้งานว่าจะทำอย่างไร แต่การใช้สแต็กอย่างละโมบทำลายหลักการนี้เนื่องจากโค้ดทุกบิตต้องกังวลว่าสแต็กสามารถสรุปได้อย่างปลอดภัยโดยใช้โค้ดที่อื่นในสายการโทร
การอ่าน
อีกเหตุผลหนึ่งคือความสามารถในการอ่าน อุดมคติที่รหัสควรปรารถนาคือการเป็นเอกสารที่มนุษย์อ่านได้โดยแต่ละบรรทัดอธิบายเพียงว่ามันทำอะไร ใช้สองแนวทางนี้:
private int getInput() {
int input;
do {
input = promptForInput();
} while (!inputIsValid(input))
return input;
}
กับ
private int getInput() {
int input = promptForInput();
if(inputIsValid(input)) {
return input;
}
return getInput();
}
ใช่ทั้งสองอย่างนี้ใช้งานได้และใช่ทั้งคู่เข้าใจง่าย แต่วิธีการทั้งสองจะอธิบายเป็นภาษาอังกฤษอย่างไร? ฉันคิดว่ามันจะเป็นดังนี้:
ฉันจะแจ้งให้ป้อนข้อมูลจนกว่าอินพุตจะถูกต้องแล้วจึงส่งคืน
กับ
ฉันจะแจ้งให้ป้อนข้อมูลจากนั้นหากอินพุตถูกต้องฉันจะส่งคืนมิฉะนั้นฉันจะได้รับอินพุตและส่งคืนผลลัพธ์ของสิ่งนั้นแทน
บางทีคุณอาจนึกถึงถ้อยคำที่ไม่เป็นระเบียบเล็กน้อยในช่วงหลัง แต่ฉันคิดว่าคุณมักจะพบว่าคำแรกจะเป็นคำอธิบายที่ถูกต้องมากขึ้นตามแนวความคิดเกี่ยวกับสิ่งที่คุณพยายามทำจริงๆ นี่ไม่ได้หมายความว่าการเรียกซ้ำจะอ่านได้น้อยเสมอไป สำหรับสถานการณ์ที่มันส่องแสงเช่นการข้ามต้นไม้คุณสามารถทำการวิเคราะห์แบบเคียงข้างกันระหว่างการเรียกซ้ำและวิธีการอื่นและคุณเกือบจะพบว่าการเรียกซ้ำให้รหัสซึ่งอธิบายตัวเองได้ชัดเจนขึ้นทีละบรรทัด
ในการแยกทั้งสองสิ่งนี้เป็นจุดเล็ก ๆ ไม่น่าเป็นไปได้มากที่สิ่งนี้จะนำไปสู่การล้นสแต็กและความสามารถในการอ่านได้น้อย แต่โปรแกรมใด ๆ จะรวบรวมการตัดสินใจเล็ก ๆ น้อย ๆ เหล่านี้ไว้มากมายดังนั้นแม้ว่าจะแยกออกจากกันก็ไม่สำคัญมากนัก แต่สิ่งสำคัญคือต้องเรียนรู้หลักการที่อยู่เบื้องหลังการทำให้ถูกต้อง