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

คำถามเกี่ยวกับวัตถุเช่นฟังก์ชันอัลกอริทึมหรือโครงสร้างข้อมูลที่แสดงออกโดยใช้อินสแตนซ์ "เล็กกว่า" ของตัวเอง

4
การเรียกซ้ำแบบหางคืออะไร
ฉันรู้ว่าแนวคิดทั่วไปของการเรียกซ้ำ ฉันเจอแนวคิดเรื่องการเรียกซ้ำหางในขณะที่ศึกษาอัลกอริทึมแบบเร่งด่วน ในวิดีโอของอัลกอริทึมการเรียงลำดับด่วนจาก MITเวลา 18:30 วินาทีอาจารย์บอกว่านี่เป็นอัลกอริทึมแบบเรียกซ้ำ ไม่ชัดเจนสำหรับฉันว่าการเรียกซ้ำแบบหางหมายถึงอะไรจริงๆ บางคนสามารถอธิบายแนวคิดด้วยตัวอย่างที่เหมาะสมได้หรือไม่ คำตอบบางอย่างให้โดยชุมชนดังนั้นที่นี่

5
การวนซ้ำสามารถแทนที่การเรียกซ้ำได้หรือไม่
ฉันได้รับการเห็นทั่วกองมากเกินเช่นที่นี่ , ที่นี่ , ที่นี่ , ที่นี่ , ที่นี่และอื่น ๆ บางอย่างที่ฉันไม่สนใจที่จะพูดถึงว่า "โปรแกรมใด ๆ ที่ใช้เรียกซ้ำสามารถแปลงเป็นโปรแกรมที่ใช้เพียงซ้ำ" มีแม้แต่กระทู้ upvoted สูงพร้อมคำตอบ upvoted อย่างมากที่กล่าวว่าใช่เป็นไป ตอนนี้ฉันไม่ได้พูดว่าพวกเขาผิด เป็นเพียงคำตอบที่ตอบโต้ความรู้น้อยของฉันและความเข้าใจเกี่ยวกับการคำนวณ ฉันเชื่อว่าทุกฟังก์ชั่นวนซ้ำสามารถแสดงเป็นการเรียกซ้ำได้และวิกิพีเดียมีคำแถลงถึงผลกระทบดังกล่าว อย่างไรก็ตามฉันสงสัยว่าการสนทนานั้นเป็นจริง สำหรับหนึ่งฉันสงสัยว่าฟังก์ชั่นแบบเรียกซ้ำไม่สามารถแสดงซ้ำ ฉันยังสงสัยว่าการปฏิบัติการหลายมิติสามารถแสดงออกซ้ำ ๆ ได้ ในคำตอบของเขา(ซึ่งฉันไม่เข้าใจโดยวิธี) กับคำถามของฉัน@YuvalFIlmus กล่าวว่ามันเป็นไปไม่ได้ที่จะแปลงลำดับของการดำเนินการทางคณิตศาสตร์ใด ๆ ให้เป็นลำดับของการเพิ่ม หากคำตอบของ YF นั้นถูกต้องแน่นอน (ฉันเดาว่ามันเป็น แต่เหตุผลของเขาอยู่เหนือหัวฉัน) นี่ก็ไม่ได้หมายความว่าไม่ใช่การเรียกซ้ำทุกครั้งที่สามารถเปลี่ยนเป็นการทำซ้ำได้? เพราะถ้าเป็นไปได้ที่จะแปลงการเรียกซ้ำทั้งหมดเป็นการวนซ้ำฉันจะสามารถแสดงการดำเนินการทั้งหมดเป็นลำดับของการเพิ่ม คำถามของฉันคือ: การเรียกซ้ำทุกครั้งสามารถเปลี่ยนเป็นการทำซ้ำได้หรือไม่และทำไม โปรดให้คำตอบกับนักเรียนมัธยมปลายที่สดใสหรือปริญญาตรีปีแรกจะเข้าใจ ขอขอบคุณ. ป.ล. ฉันไม่ทราบว่าการเรียกซ้ำแบบดั้งเดิมคืออะไร (ฉันรู้เกี่ยวกับฟังก์ชัน Ackermann และนั่นไม่ใช่การเรียกซ้ำแบบดั้งเดิม แต่ยังคงคำนวณได้ ALL …

5
ใช้การสอบถามซ้ำเมื่อใด
อินสแตนซ์บางตัว (ค่อนข้าง) ขั้นพื้นฐาน (คิดว่านักเรียนระดับ CS ปีแรกของวิทยาลัย) เมื่อไรที่เราจะใช้การเรียกซ้ำแทนการวนซ้ำ?

6
GCD มีประสิทธิภาพมากที่สุดคืออะไร
ฉันรู้ว่าอัลกอริทึมของ Euclid เป็นอัลกอริทึมที่ดีที่สุดในการรับ GCD (ตัวหารร่วมมาก) ของรายการจำนวนเต็มบวก แต่ในทางปฏิบัติคุณสามารถเขียนโค้ดอัลกอริทึมนี้ได้หลายวิธี (ในกรณีของฉันฉันตัดสินใจใช้ Java แต่ C / C ++ อาจเป็นตัวเลือกอื่น) ฉันต้องใช้รหัสที่มีประสิทธิภาพที่สุดเท่าที่จะเป็นไปได้ในโปรแกรมของฉัน ในโหมดเรียกซ้ำคุณสามารถเขียน: static long gcd (long a, long b){ a = Math.abs(a); b = Math.abs(b); return (b==0) ? a : gcd(b, a%b); } และในโหมดวนซ้ำดูเหมือนว่า: static long gcd (long a, long b) { long r, i; …

2
นิยามแบบเรียกซ้ำมากกว่าชนิดอุปนัยที่มีส่วนประกอบซ้อนอยู่
พิจารณาประเภทอุปนัยที่มีเกิดขึ้นซ้ำในบางตำแหน่งที่ซ้อนกัน แต่เป็นบวกอย่างเคร่งครัด ตัวอย่างเช่นต้นไม้ที่มีการ จำกัด การแยกด้วยโหนดโดยใช้โครงสร้างข้อมูลรายการทั่วไปเพื่อจัดเก็บเด็ก ๆ Inductive LTree : Set := Node : list LTree -> LTree. วิธีที่ไร้เดียงสาของการกำหนดฟังก์ชั่นแบบเรียกซ้ำผ่านต้นไม้เหล่านี้โดยการเรียกซ้ำกว่าต้นไม้และรายการต้นไม้ไม่ทำงาน นี่คือตัวอย่างของsizeฟังก์ชันที่คำนวณจำนวนโหนด Fixpoint size (t : LTree) : nat := match t with Node l => 1 + (size_l l) end with size_l (l : list LTree) : nat := match l with …

3
เหตุใดลูปจึงเร็วกว่าการเรียกซ้ำ
ในทางปฏิบัติฉันเข้าใจว่าการเรียกซ้ำใด ๆ สามารถเขียนเป็นลูป (และในทางกลับกัน (?)) และหากเราวัดด้วยคอมพิวเตอร์จริงเราพบว่าลูปนั้นเร็วกว่าการเรียกซ้ำสำหรับปัญหาเดียวกัน แต่มีทฤษฎีอะไรที่ทำให้เกิดความแตกต่างนี้

2
ผู้ประสานงาน Y ขัดแย้งกับจดหมายโต้ตอบ Curry-Howard หรือไม่?
อ Y Combinator มีชนิดโดย Curry-Howard Correspondence เพราะประเภทเป็นที่อยู่อาศัยมันจะต้องสอดคล้องกับทฤษฎีบทที่แท้จริง อย่างไรก็ตามเป็นจริงเสมอดังนั้นมันจึงดูเหมือนว่าชนิดของ combinator Y นั้นสอดคล้องกับทฤษฎีบทซึ่งไม่จริงเสมอไป สิ่งนี้จะเป็นอย่างไร( → ) → →( a → a ) → a(a→a)→a(a \rightarrow a) \rightarrow a( a → a ) → a(a→a)→a(a \rightarrow a) \rightarrow aa → aa→aa \rightarrow aaaa

3
ต้นไม้สามารถเคลื่อนที่ได้โดยไม่ต้องทำการวนซ้ำกองซ้อนหรือคิวและมีพอยน์เตอร์เพียงไม่กี่ตัว?
ครึ่งทศวรรษที่ผ่านมาฉันนั่งอยู่ในคลาสโครงสร้างข้อมูลที่อาจารย์ให้เครดิตพิเศษถ้าใครก็ตามสามารถสำรวจต้นไม้โดยไม่ต้องใช้การเรียกซ้ำกองซ้อนคิว ฯลฯ (หรือโครงสร้างข้อมูลอื่นที่คล้ายคลึงกัน) และเพียงไม่กี่ตัวชี้ ฉันมากับสิ่งที่ฉันคิดว่าเป็นคำตอบที่ชัดเจนสำหรับคำถามซึ่งท้ายที่สุดได้รับการยอมรับจากอาจารย์ ฉันนั่งอยู่ในชั้นเรียนคณิตศาสตร์แบบแยกส่วนกับศาสตราจารย์คนอื่นในแผนกเดียวกัน - และเขายืนยันว่ามันเป็นไปไม่ได้ที่จะเข้าไปสำรวจต้นไม้โดยไม่ต้องเรียกซ้ำกองซ้อนคิว ฯลฯ และวิธีการแก้ปัญหาของฉันไม่ถูกต้อง ดังนั้นมันเป็นไปได้หรือเป็นไปไม่ได้? ทำไมหรือทำไมไม่? แก้ไข: เพื่อเพิ่มความกระจ่างบางอย่างฉันใช้สิ่งนี้บนต้นไม้ไบนารีซึ่งมีสามองค์ประกอบ - ข้อมูลที่จัดเก็บที่แต่ละโหนดและตัวชี้ไปยังลูกสองคน โซลูชันของฉันสามารถขยายไปยังต้นไม้ n-ary ด้วยการเปลี่ยนแปลงเพียงเล็กน้อยเท่านั้น ครูโครงสร้างข้อมูลของฉันไม่ได้ จำกัด ข้อ จำกัด ใด ๆ กับการกลายพันธุ์ต้นไม้และแน่นอนฉันค้นพบในภายหลังว่าวิธีแก้ปัญหาของเขาคือใช้พอยน์เตอร์ชี้ไปที่ต้นไม้ในทางของเขา อาจารย์คณิตศาสตร์ที่ไม่ต่อเนื่องของฉันกล่าวว่าการกลายพันธุ์ของต้นไม้หมายความว่ามันไม่ได้เป็นต้นไม้ตามคำนิยามทางคณิตศาสตร์ของต้นไม้อีกต่อไปคำจำกัดความของเขาก็จะห้ามพอยน์เตอร์ชี้ไปยังผู้ปกครอง - ซึ่งจะตรงกับกรณีที่

2
โปรแกรมนี้จะยุติสำหรับ Integer ทุกคนหรือไม่
ในการทดสอบชิ้นส่วนสำหรับการเตรียม GATE มีคำถาม: f(n): if n is even: f(n) = n/2 else f(n) = f(f(n-1)) ผมตอบว่า "มันจะยุติสำหรับจำนวนเต็มทุกคน" เพราะแม้สำหรับจำนวนเต็มเชิงลบบางอย่างก็จะยุติการเป็นข้อผิดพลาดกองมากเกิน แต่เพื่อนของฉันไม่เห็นด้วยที่บอกว่าเนื่องจากนี่ไม่ใช่โค้ดที่นำมาใช้และเป็นรหัสเทียมก็จะเรียกซ้ำไม่สิ้นสุดในกรณีที่มีจำนวนเต็มลบ คำตอบใดถูกต้องและทำไม

2
ข้อเสียใดที่อนุญาตให้กำจัดหางแบบโมดูโลแบบเรียกซ้ำแบบหางได้?
ฉันคุ้นเคยกับแนวคิดของการกำจัดการเรียกซ้ำแบบหางพื้นฐานซึ่งฟังก์ชันที่ส่งคืนผลลัพธ์โดยตรงของการโทรหาตัวเองสามารถเขียนใหม่ได้เป็นลูปวนซ้ำ foo(...): # ... return foo(...) ฉันยังเข้าใจว่าเป็นกรณีพิเศษฟังก์ชั่นยังสามารถเขียนใหม่ถ้าโทร recursive consถูกห่อในการเรียกไปยัง foo(...): # ... return (..., foo(...)) คุณสมบัติอะไรที่consอนุญาตให้ทำเช่นนี้? ฟังก์ชั่นอื่นใดนอกจากconsสามารถตัดหางเรียกซ้ำโดยไม่ทำลายความสามารถของเราในการเขียนซ้ำซ้ำ? GCC (แต่ไม่ใช่เสียงดังกราว) สามารถเพิ่มประสิทธิภาพตัวอย่างนี้ของ "การคูณแบบโมดูโลแบบเรียกซ้ำหาง" แต่ก็ไม่มีความชัดเจนว่ากลไกใดที่อนุญาตให้ค้นพบสิ่งนี้หรือวิธีทำให้เกิดการเปลี่ยนแปลง pow(x, n): if n == 0: return 1 else if n == 1: return x else: return x * pow(x, n-1)

6
ตัวอย่างของอัลกอริทึมแบบเรียกซ้ำที่ซับซ้อน
ผมได้อธิบายที่มีชื่อเสียงกำหนดขั้นตอนวิธีการเลือกเส้นเวลา (ค่ามัธยฐานของอัลกอริทึมมีเดีย) ให้เพื่อน การเรียกซ้ำในอัลกอริทึมนี้ (ในขณะที่เรียบง่ายมาก) นั้นค่อนข้างซับซ้อน มีการเรียกซ้ำสองครั้งแต่ละครั้งมีพารามิเตอร์แตกต่างกัน ฉันพยายามค้นหาตัวอย่างอื่น ๆ ของอัลกอริทึมแบบเรียกซ้ำที่น่าสนใจ แต่ไม่สามารถหาได้ อัลกอริธึมการเรียกซ้ำทั้งหมดที่ฉันสามารถทำได้คือการเรียกซ้ำแบบง่าย ๆ หรือการแบ่งและพิชิตอย่างง่าย คุณช่วยยกตัวอย่างการเรียกซ้ำที่ซับซ้อนได้ไหม

1
นี่เป็นวิธีทั่วไปในการแปลงกระบวนงานแบบเรียกซ้ำใด ๆ ไปเป็นการเรียกซ้ำแบบหางหรือไม่?
ดูเหมือนว่าฉันได้พบวิธีทั่วไปในการแปลงขั้นตอนการเรียกซ้ำใด ๆ เป็นการเรียกซ้ำแบบหาง: กำหนดกระบวนการย่อยผู้ช่วยด้วยพารามิเตอร์ "ผลลัพธ์" พิเศษ ใช้สิ่งที่จะนำไปใช้กับค่าส่งคืนของโพรซีเดอร์กับพารามิเตอร์นั้น เรียกขั้นตอนผู้ช่วยนี้เพื่อเริ่มต้น ค่าเริ่มต้นสำหรับพารามิเตอร์ "result" คือค่าสำหรับจุดออกของกระบวนการซ้ำเพื่อให้กระบวนการวนซ้ำผลลัพธ์เริ่มต้นจากจุดที่กระบวนการวนซ้ำเริ่มหดตัว ตัวอย่างเช่นต่อไปนี้เป็นขั้นตอนการเรียกซ้ำแบบดั้งเดิมที่จะทำการแปลง ( SICP แบบฝึกหัด 1.17 ): (define (fast-multiply a b) (define (double num) (* num 2)) (define (half num) (/ num 2)) (cond ((= b 0) 0) ((even? b) (double (fast-multiply a (half b)))) (else (+ (fast-multiply a (- …

4
ความซับซ้อนของอัลกอริทึม Fibonacci แบบเรียกซ้ำ
การใช้อัลกอริทึม Fibonacci แบบเรียกซ้ำดังต่อไปนี้: def fib(n): if n==0: return 0 elif n==1 return 1 return (fib(n-1)+fib(n-2)) หากฉันป้อนหมายเลข 5 เพื่อค้นหาจุดอิ่มตัว (5) ฉันรู้ว่าสิ่งนี้จะส่งออก 5 แต่ฉันจะตรวจสอบความซับซ้อนของอัลกอริทึมนี้ได้อย่างไร ฉันจะคำนวณขั้นตอนที่เกี่ยวข้องได้อย่างไร

1
หอคอยแห่งฮานอย แต่มีการกำหนดค่าเริ่มต้นและครั้งสุดท้ายโดยพลการ
เมื่อเร็ว ๆ นี้ฉันมาข้ามปัญหานี้การเปลี่ยนแปลงของทาวเวอร์ของฮานอย คำชี้แจงปัญหา: พิจารณารูปแบบที่แตกต่างของความรู้ดีหอคอยแห่งฮานอย: เราได้รับหอคอยและดิสก์nnnขนาดซ้อนกันในหอคอยบางแห่ง วัตถุประสงค์ของคุณคือถ่ายโอนดิสก์ทั้งหมดไปยังหอคอยด้วยการเคลื่อนไหวน้อยที่สุดเท่าที่จะทำได้ แต่คำนึงถึงกฎต่อไปนี้:1 , 2 , 3 , … , ม1,2,3,...,ม.1,2,3,\dots,mkTHkTHk^{\text{th}} การย้ายดิสก์ครั้งละหนึ่งแผ่นเท่านั้น ไม่เคยย้ายดิสก์ที่มีขนาดใหญ่กว่าไปยังดิสก์ที่เล็กกว่า การเคลื่อนย้ายระหว่างอาคารที่มีระยะทางที่มากที่สุดdddd (ข้อ จำกัด ในปัญหาดั้งเดิม: และจำนวนกรณีทดสอบคุณสามารถสรุปได้ว่าปัญหาทั้งหมดสามารถแก้ไขได้ในการเคลื่อนไหวไม่เกิน )3 ≤ n ≤ 1,0003≤n≤10003 \le n \le 1000m ≤ 100ม.≤100m \le 100≤ 1,000≤1000\le 1000200002000020000 มันเป็นสิ่งที่น่าสนใจ หอคอยคลาสสิคของปัญหาฮานอยมีแหล่งที่มาปลายทางและหอคอยชั่วคราวที่ใช้ในการย้ายดิสก์จากแหล่งที่มาไปยังปลายทาง ปัญหาที่เกิดขึ้นบนไซต์นั้นจะมีการกำหนดค่าเริ่มต้นและขั้นสุดท้าย วิธีการหนึ่งจะเข้าถึงปัญหานี้ได้อย่างไร

3
“ เหนี่ยวนำ” และ“ ซ้ำ ๆ ” มีความหมายคล้ายกันมากหรือไม่?
"เหนี่ยวนำ" และ "เรียกซ้ำ" หมายถึงคล้ายกันมากหรือไม่ ตัวอย่างเช่นหากมีอัลกอริทึมที่กำหนดเวกเตอร์ n-dim โดยพิจารณาส่วนประกอบ k + 1 แรกตามองค์ประกอบ k แรกที่ได้รับการพิจารณาและเริ่มต้นด้วยองค์ประกอบแรกคุณจะเรียกมันว่าทำงานซ้ำหรือเหนี่ยวนำได้หรือไม่? ฉันใช้คำว่า "ซ้ำซาก" แต่วันนี้มีคนบอกว่า "เหนี่ยวนำ"

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