ปัญหานี้เน้นไปที่อัลกอริทึมเป็นหลักซึ่งอาจเป็นสิ่งที่เป็นนามธรรมและเป็นวิชาการ
ตัวอย่างคือการเสนอความคิดฉันต้องการวิธีการทั่วไปดังนั้นตัวอย่างจะใช้เพื่อทำให้เราชัดเจนยิ่งขึ้นเกี่ยวกับความคิดของคุณ
โดยทั่วไปแล้วการวนซ้ำสามารถแปลงเป็นแบบวนซ้ำได้
เช่น:
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) เราสามารถหา "วิธีการทั่วไปทั่วไป" ในการแปลงลูป (สำหรับ / ในขณะที่……) เป็นแบบเรียกซ้ำได้หรือไม่? และเราควรใส่ใจกับสิ่งใดบ้างในขณะทำการเปลี่ยนใจเลื่อมใส? มันจะเป็นการดีกว่าถ้าคุณเขียนข้อมูลโดยละเอียดกับตัวอย่างและทฤษฎี persudo ของคุณรวมถึงกระบวนการแปลง
2) "Recursive" มีสองรูปแบบ: Linely recursive และ Tail-Recursive แล้วแปลงไหนดีกว่ากัน? "กฎ" อะไรที่เราควรเชี่ยวชาญ
3) บางครั้งเราจำเป็นต้องรักษา "ประวัติศาสตร์" ของการเรียกซ้ำสิ่งนี้สามารถทำได้อย่างง่ายดายในคำสั่งวนซ้ำ:
เช่น:
List<string> history = new List<string>();
int sum=0;
for (int i=1;i<=100;++i)
{
if(i==1) history.Add(i.ToString()+"'s result is:1.");
else
{
StringBuilder sub = new StringBuilder();
for(int j=1;j<=i;++j)
{
if(j==i) sbu.Append(j.ToString());
else
{
sub.Append(j.ToString()+"+");
}
}
sum +=i;
sbu.Append("'s result is:"+sum+Environment.NewLine);
}
}
ผลลัพธ์ด้านล่างคือ:
ผลลัพธ์ 1 คือ 1
ผลลัพธ์ของ 1 + 2 คือ 3
1 + 2 + 3 ผลลัพธ์คือ 6 …………
อย่างไรก็ตามฉันคิดว่าเป็นการยากที่จะเก็บประวัติไว้ในแบบเรียกซ้ำเนื่องจากอัลกอริทึมแบบเรียกซ้ำมุ่งเน้นไปที่การรับผลลัพธ์สุดท้ายและทำการโทรกลับ ดังนั้นสิ่งเหล่านี้จะทำผ่านสแต็กที่ดูแลโดยภาษาการเขียนโปรแกรมกำหนดหน่วยความจำในรูปแบบของสแต็คโดยอัตโนมัติ และวิธีที่เรา "ด้วยตนเอง" นำแต่ละ "ค่าสแต็ก" ออกและคืนค่าหลายค่าผ่านอัลกอริทึมแบบเรียกซ้ำได้อย่างไร
และสิ่งที่เกี่ยวกับ "จากอัลกอริทึมแบบเรียกซ้ำไปยังวนซ้ำ" พวกเขาสามารถแปลงแต่ละอื่น ๆ (ฉันคิดว่ามันควรจะทำในทางทฤษฎี แต่ฉันต้องการสิ่งที่ถูกต้องมากขึ้นเพื่อพิสูจน์ความคิดของฉัน)