Vấn đề này chủ yếu tập trung vào thuật toán, có thể là một cái gì đó trừu tượng và mang tính học thuật hơn.
Ví dụ đưa ra một ý nghĩ, tôi muốn một cách chung chung, vì vậy ví dụ chỉ được sử dụng để làm cho chúng tôi rõ hơn về suy nghĩ của bạn.
Nói chung, một vòng lặp có thể được chuyển đổi thành một đệ quy.
ví dụ:
for(int i=1;i<=100;++i){sum+=i;}
Và đệ quy liên quan của nó là:
int GetTotal(int number)
{
if (number==1) return 1; //The end number
return number+GetTotal(number-1); //The inner recursive
}
Và cuối cùng để đơn giản hóa điều này, một đệ quy đuôi là cần thiết:
int GetTotal (int number, int sum)
{
if(number==1) return sum;
return GetTotal(number-1,sum+number);
}
Tuy nhiên, hầu hết các trường hợp không dễ dàng để trả lời và phân tích. Những gì tôi muốn biết là:
1) Chúng ta có thể có một "cách chung chung" để chuyển đổi một vòng lặp (cho / trong khi) thành một đệ quy không? Và những loại điều chúng ta nên chú ý trong khi thực hiện chuyển đổi? Sẽ tốt hơn nếu viết thông tin chi tiết với một số mẫu và lý thuyết sai lầm của bạn cũng như quá trình chuyển đổi.
2) "Đệ quy" có hai dạng: Đệ quy hoàn toàn và Đệ quy đuôi. Vì vậy, tốt hơn để chuyển đổi? "Quy tắc" nào chúng ta nên nắm vững?
3) Đôi khi chúng ta cần giữ "lịch sử" đệ quy, điều này dễ dàng được thực hiện trong một câu lệnh lặp:
ví dụ:
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);
}
}
Kết quả dưới đây là:
Kết quả 1 là 1.
Kết quả 1 + 2 là 3.
Kết quả 1 + 2 + 3 là 6 trận
Tuy nhiên, tôi nghĩ rằng thật khó để giữ lịch sử theo cách đệ quy, bởi vì thuật toán dựa trên đệ quy tập trung vào việc lấy kết quả cuối cùng và thực hiện trả lại cuộc gọi lại. Vì vậy, tất cả những điều này được thực hiện thông qua ngăn xếp được duy trì bởi ngôn ngữ lập trình gán bộ nhớ ở dạng ngăn xếp tự động. Và làm thế nào chúng ta có thể "thủ công" lấy từng "giá trị ngăn xếp" ra và trả về nhiều giá trị thông qua thuật toán đệ quy?
Và những gì về "từ một thuật toán đệ quy đến một vòng lặp"? Họ có thể được chuyển đổi cho nhau (tôi nghĩ rằng nó nên được thực hiện trên lý thuyết, nhưng tôi muốn những điều chính xác hơn để chứng minh suy nghĩ của tôi) .