คำถามติดแท็ก recursion

สำหรับคำถามเกี่ยวกับการเรียกซ้ำการฝึกเรียกวิธีการหรือฟังก์ชันจากภายในตัวเอง

11
มีอะไรที่สามารถทำได้ด้วยการเรียกซ้ำที่ไม่สามารถทำได้ด้วยการวนซ้ำ?
มีบางครั้งที่การใช้การเรียกซ้ำนั้นดีกว่าการใช้การวนซ้ำและเวลาที่การใช้การวนซ้ำนั้นดีกว่าการใช้การวนซ้ำ การเลือก "สิทธิ" สามารถบันทึกทรัพยากรและ / หรือส่งผลให้มีรหัสบรรทัดน้อยลง มีกรณีใดบ้างที่ภารกิจสามารถทำได้โดยใช้การเรียกซ้ำเท่านั้นแทนที่จะวนซ้ำหรือไม่?
126 recursion  loops 

8
การเรียกซ้ำหรือในขณะที่ลูป
ฉันกำลังอ่านเกี่ยวกับการสัมภาษณ์การพัฒนาโดยเฉพาะเกี่ยวกับคำถามทางเทคนิคและการทดสอบที่ถามในการสัมภาษณ์และฉันได้พบคำพูดของประเภท "ไม่กี่ครั้ง" ตกลงคุณแก้ปัญหาด้วยการวนขณะนี้คุณสามารถทำกับ การเรียกซ้ำ "หรือ" ทุกคนสามารถแก้ปัญหานี้ด้วย 100 บรรทัดในขณะที่วนซ้ำ แต่พวกเขาสามารถทำได้ในฟังก์ชั่นวนซ้ำ 5 บรรทัดหรือไม่? " เป็นต้น คำถามของฉันคือการเรียกซ้ำโดยทั่วไปดีกว่าถ้า / ในขณะ / สำหรับการสร้างหรือไม่ ฉันคิดเสมอว่าการเรียกซ้ำไม่ควรเลือกเพราะมัน จำกัด หน่วยความจำสแต็คที่เล็กกว่าฮีปมากการทำฟังก์ชั่น / เมธอดเป็นจำนวนมากนั้นไม่ดีเท่าที่ควร แต่ฉันอาจ จะผิด...

5
ทำไม Java จึงไม่มีการปรับให้เหมาะสำหรับการเรียกซ้ำทั้งหมด
จากสิ่งที่ฉันได้อ่าน: เหตุผลก็เพราะมันไม่ง่ายที่จะตัดสินว่าวิธีการใดที่จะถูกเรียกตามที่เราได้รับมรดก อย่างไรก็ตามทำไม Java อย่างน้อยก็ไม่มีการปรับให้เหมาะสมแบบเรียกซ้ำสำหรับเมธอดแบบสแตติกและบังคับใช้วิธีที่เหมาะสมในการเรียกเมธอดแบบสแตติกกับคอมไพเลอร์? ทำไม Java ไม่ได้รับการสนับสนุนใด ๆ เลยสำหรับการเรียกซ้ำ? ฉันไม่แน่ใจว่ามีปัญหาใด ๆ หรือไม่ เกี่ยวกับคำแนะนำซ้ำตามที่อธิบายโดยJörg W Mittag 1 : อีกคำถามหนึ่งถามเกี่ยวกับ TCO คำถามนี้เกี่ยวกับ TRE TRE นั้นง่ายกว่า TCO มาก นอกจากนี้คำถามอื่นถามเกี่ยวกับข้อ จำกัด ที่ JVM กำหนดในการปรับใช้ภาษาที่ต้องการรวบรวม JVM คำถามนี้ถามเกี่ยวกับ Java ซึ่งเป็นภาษาหนึ่งที่ไม่ได้ถูก จำกัด โดย JVM เนื่องจาก JVM spec สามารถเปลี่ยนแปลงได้โดย คนเดียวกันที่ออกแบบ Java และสุดท้ายไม่มีข้อ จำกัด ใน JVM เกี่ยวกับ TRE …

18
ในภาษาอังกฤษธรรมดาการเรียกซ้ำคืออะไร?
แนวคิดของการเรียกซ้ำไม่เป็นเรื่องธรรมดาในโลกแห่งความเป็นจริง ดังนั้นดูเหมือนว่าสับสนกับโปรแกรมเมอร์สามเณร แม้ว่าฉันคิดว่าพวกเขาคุ้นเคยกับแนวคิดทีละน้อย ดังนั้นอะไรคือคำอธิบายที่ดีสำหรับพวกเขาที่จะเข้าใจความคิดได้อย่างง่ายดาย
74 recursion 

3
ความแตกต่างระหว่างการเรียกซ้ำและการสำรวจคืออะไร
ความแตกต่างระหว่างสิ่งเหล่านี้คืออะไร? recursion Corecursion บนวิกิพีเดียมีข้อมูลเพียงเล็กน้อยและไม่มีรหัสที่ชัดเจนที่อธิบายถึงข้อกำหนดเหล่านี้ อะไรคือตัวอย่างง่ายๆที่อธิบายคำศัพท์เหล่านี้ การกลับเป็นสองเท่าของการเรียกซ้ำเป็นอย่างไร? มีอัลกอริธึมการยืนยันคลาสสิกหรือไม่?

17
การเรียกซ้ำโดยไม่มีแฟกทอเรียหมายเลขฟีโบนักชี ฯลฯ
เกือบทุกบทความที่ฉันสามารถหาได้เกี่ยวกับการเรียกซ้ำรวมถึงตัวอย่างของตัวเลขหรือตัวเลขฟีโบนักชีซึ่ง ได้แก่ : คณิตศาสตร์ ไร้ประโยชน์ในชีวิตจริง มีตัวอย่างโค้ดที่ไม่ใช่คณิตศาสตร์ที่น่าสนใจสำหรับสอนการเรียกซ้ำหรือไม่ ฉันคิดว่าอัลกอริทึมการหารและพิชิต แต่พวกเขามักจะเกี่ยวข้องกับโครงสร้างข้อมูลที่ซับซ้อน
47 recursion 

8
มีวิธีใดบ้างที่จะหลีกเลี่ยงการโอเวอร์โฟลว์สแต็กในอัลกอริทึมแบบเรียกซ้ำได้
คำถาม มีวิธีใดที่เป็นไปได้ในการแก้ปัญหาการล้นสแต็กที่เกิดจากอัลกอริทึมแบบเรียกซ้ำ ตัวอย่าง ฉันกำลังพยายามแก้ปัญหาProject Euler 14และตัดสินใจลองใช้อัลกอริทึมแบบเรียกซ้ำ อย่างไรก็ตามโปรแกรมหยุดทำงานด้วย java.lang.StackOverflowError เข้าใจได้. อัลกอริทึมโอเวอร์โฟลว์สแต็คจริง ๆ เพราะฉันพยายามสร้างลำดับ Collatz สำหรับจำนวนมาก โซลูชั่น ดังนั้นฉันจึงสงสัยว่า: วิธีการมาตรฐานแบบใดที่จะแก้ปัญหาสแต็คโอเวอร์โฟลว์โดยสมมติว่าอัลกอริธึมวนซ้ำของคุณเขียนอย่างถูกต้องและจะจบลงด้วยการล้นสแต็กเสมอ แนวคิดสองประการที่อยู่ในใจคือ: หางเรียกซ้ำ การย้ำ แนวคิด (1) และ (2) ถูกต้องหรือไม่ มีตัวเลือกอื่น ๆ อีกไหม? แก้ไข มันจะช่วยให้เห็นบางรหัสโดยเฉพาะอย่างยิ่งใน Java, C #, Groovy หรือ Scala อาจจะไม่ใช้ปัญหา Project Euler ที่กล่าวมาข้างต้นดังนั้นมันจะไม่ทำให้ผู้อื่นเสีย แต่ใช้อัลกอริทึมอื่น ๆ แฟกทอเรียลอาจหรือสิ่งที่คล้ายกัน

8
ภาษาที่ใช้งานได้ดีกว่าเมื่อเรียกซ้ำหรือไม่
TL; DR: ภาษาที่ใช้งานได้จัดการการเรียกซ้ำได้ดีกว่าภาษาที่ไม่ทำงานหรือไม่ ขณะนี้ฉันกำลังอ่าน Code Complete 2 ในบางช่วงของหนังสือผู้แต่งเตือนเราเกี่ยวกับการเรียกซ้ำ เขาบอกว่าควรหลีกเลี่ยงเมื่อเป็นไปได้และฟังก์ชั่นที่ใช้การเรียกซ้ำโดยทั่วไปมีประสิทธิภาพน้อยกว่าโซลูชันที่ใช้ลูป ตัวอย่างผู้เขียนเขียนฟังก์ชัน Java โดยใช้การเรียกซ้ำเพื่อคำนวณแฟกทอเรียลของตัวเลขเช่นนั้น (อาจไม่เหมือนกันทั้งหมดเนื่องจากฉันไม่มีหนังสือกับฉันในขณะนี้): public int factorial(int x) { if (x <= 0) return 1; else return x * factorial(x - 1); } นี่เป็นวิธีแก้ปัญหาที่ไม่ดี อย่างไรก็ตามในภาษาที่ใช้งานได้การใช้การเรียกซ้ำเป็นวิธีที่นิยมใช้ในการทำสิ่งต่างๆ ตัวอย่างเช่นนี่คือฟังก์ชันแฟกทอเรียลใน Haskell โดยใช้การเรียกซ้ำ: factorial :: Integer -> Integer factorial 0 = 1 factorial n = n …

11
ขณะที่วนซ้ำภายในเรียกซ้ำ?
ฉันสงสัยว่าขณะที่ลูปนั้นวนซ้ำอยู่ภายในหรือไม่ ฉันคิดว่ามันเป็นเพราะในขณะที่วงสามารถมองเห็นเป็นฟังก์ชั่นที่เรียกตัวเองว่าในตอนท้าย ถ้ามันไม่ใช่การเรียกซ้ำแล้วความแตกต่างคืออะไร?
37 recursion  loops 

5
ประสิทธิภาพ: การเรียกซ้ำกับการทำซ้ำใน Javascript
ฉันได้อ่านเมื่อเร็ว ๆ นี้บางบทความ (เช่นhttp://dailyjs.com/2012/09/14/functional-programming/ ) เกี่ยวกับลักษณะการทำงานของ Javascript และความสัมพันธ์ระหว่าง Scheme และ Javascript (อันหลังได้รับอิทธิพลจากอันแรกซึ่ง เป็นภาษาที่ใช้งานได้ในขณะที่ลักษณะของ OO นั้นสืบทอดมาจาก Self ซึ่งเป็นภาษาที่ใช้สร้างต้นแบบ อย่างไรก็ตามคำถามของฉันเฉพาะเจาะจงมากขึ้น: ฉันสงสัยว่ามีตัวชี้วัดเกี่ยวกับประสิทธิภาพของการเรียกซ้ำกับการทำซ้ำใน Javascript หรือไม่ ฉันรู้ว่าในบางภาษา (โดยการทำซ้ำการออกแบบมีประสิทธิภาพดีกว่า) ความแตกต่างน้อยที่สุดเพราะล่าม / คอมไพเลอร์แปลงการเรียกซ้ำเป็นการวนซ้ำอย่างไรก็ตามฉันเดาว่านี่อาจไม่ใช่กรณีของ Javascript เพราะอย่างน้อยก็เป็นส่วนที่ใช้งานได้ ภาษา.

2
วิธีทั่วไปในการแปลงลูป (ในขณะ / สำหรับ) การเรียกซ้ำหรือจากการวนซ้ำเป็นลูป?
ปัญหานี้เน้นไปที่อัลกอริทึมเป็นหลักซึ่งอาจเป็นสิ่งที่เป็นนามธรรมและเป็นวิชาการ ตัวอย่างคือการเสนอความคิดฉันต้องการวิธีการทั่วไปดังนั้นตัวอย่างจะใช้เพื่อทำให้เราชัดเจนยิ่งขึ้นเกี่ยวกับความคิดของคุณ โดยทั่วไปแล้วการวนซ้ำสามารถแปลงเป็นแบบวนซ้ำได้ เช่น: for(int i=1;i<=100;++i){sum+=i;} และ recursive ที่เกี่ยวข้องคือ: int GetTotal(int number) { if (number==1) return 1; //The end number return number+GetTotal(number-1); //The inner recursive } และท้ายที่สุดเพื่อลดความซับซ้อนนี้จำเป็นต้องเรียกซ้ำแบบหาง: int GetTotal (int number, int sum) { if(number==1) return sum; return GetTotal(number-1,sum+number); } อย่างไรก็ตามกรณีส่วนใหญ่นั้นไม่ใช่เรื่องง่ายที่จะตอบและวิเคราะห์ สิ่งที่ฉันอยากรู้คือ: 1) เราสามารถหา "วิธีการทั่วไปทั่วไป" ในการแปลงลูป (สำหรับ / ในขณะที่……) เป็นแบบเรียกซ้ำได้หรือไม่? …

7
ภาษาการเขียนโปรแกรมที่จำเป็นไม่รองรับการเรียกซ้ำ?
สำหรับความรู้ของฉันภาษาการเขียนโปรแกรมภาษาคำสั่งที่ทันสมัยทั้งหมดสนับสนุนการสอบถามซ้ำในแง่ที่ว่ากระบวนการสามารถเรียกตัวเองได้ นี่ไม่ใช่กรณีเสมอไป แต่ฉันไม่สามารถหาข้อเท็จจริงที่ยากลำบากได้ด้วยการค้นหาโดย Google อย่างรวดเร็ว ดังนั้นคำถามของฉันคือ: ภาษาใดที่ไม่รองรับการสอบถามซ้ำตั้งแต่เริ่มต้นและการสนับสนุนนั้นเพิ่มเมื่อใด

2
Y combinator และการปรับหางเรียกให้เหมาะสม
คำจำกัดความของ Y combinator ใน F # คือ let rec y f x = f (y f) x f คาดว่าจะเป็นอาร์กิวเมนต์แรกที่มีความต่อเนื่องสำหรับปัญหาย่อยแบบเรียกซ้ำ การใช้ yf เป็นสิ่งต่อเนื่องเราจะเห็นว่า f จะถูกนำไปใช้กับการโทรติดต่ออย่างต่อเนื่องในขณะที่เราสามารถพัฒนาได้ let y f x = f (y f) x = f (f (y f)) x = f (f (f (y f))) x etc... ปัญหาคือโครงร่างนี้ precludes โดยใช้การปรับ …

10
ตัวชี้ / การเรียกซ้ำเป็นเรื่องยากอะไร [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน5 ปีที่ผ่านมา ในอันตรายของโรงเรียนจาวาโจเอลกล่าวถึงประสบการณ์ของเขาที่เพนน์และความยากลำบากของ "การแบ่งส่วนความผิดพลาด" เขาพูดว่า [segfaults นั้นยากจนกระทั่งคุณ] "หายใจลึก ๆ และพยายามบังคับจิตใจของคุณให้ทำงานในระดับนามธรรมที่แตกต่างกันสองระดับพร้อมกัน" จากรายการสาเหตุทั่วไปของsegfaults ฉันไม่เข้าใจว่าเราต้องทำงานในระดับนามธรรมได้อย่างไร ด้วยเหตุผลบางอย่างโจเอลพิจารณาแนวคิดหลักเหล่านี้เป็นความสามารถของโปรแกรมเมอร์ในการสรุป ฉันไม่ต้องการคิดมากเกินไป ดังนั้นอะไรที่เป็นเรื่องยากสำหรับพอยน์เตอร์ / การเรียกซ้ำ? ตัวอย่างจะดี
20 c  pointers  recursion 

2
คอมไพเลอร์สามารถแปลงตรรกะแบบเรียกซ้ำเป็นตรรกะแบบไม่ซ้ำแบบเรียกซ้ำได้หรือไม่
ฉันได้เรียนรู้ F # และมันเริ่มมีอิทธิพลต่อความคิดของฉันเมื่อฉันเขียนโปรแกรม C # ด้วยเหตุนี้ฉันจึงใช้การเรียกซ้ำเมื่อฉันรู้สึกว่าผลลัพธ์นั้นช่วยให้อ่านได้ง่ายขึ้นและฉันก็ไม่สามารถจินตนาการได้ว่ามันคดเคี้ยวจนล้นสแต็ค สิ่งนี้ทำให้ฉันถามว่าคอมไพเลอร์สามารถแปลงฟังก์ชั่นแบบเรียกซ้ำเป็นแบบที่ไม่ใช่แบบเรียกซ้ำได้หรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.