Ця проблема в основному зосереджена на алгоритмі, можливо, щось абстрактне і більш академічне.
На прикладі пропонується думка, я хочу загальний шлях, тому приклад використовується лише для того, щоб зрозуміти нам ваші думки.
Взагалі кажучи, цикл може бути перетворений в рекурсивний.
наприклад:
for(int i=1;i<=100;++i){sum+=i;}
І пов'язана з цим рекурсивна:
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) "Рекурсивний" має дві форми: лінійно-рекурсивний і хвостово-рекурсивний. То що краще конвертувати? Яке «правило» ми повинні освоїти?
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 …………
Однак я думаю, що важко тримати історію в рекурсивному стані, тому що алгоритм, заснований на рекурсії, зосереджується на отриманні останнього результату і на зворотній дзвінок. Отже, все це робиться через стек, що підтримується мовою програмування, призначаючи пам'ять у вигляді стека автоматично. І як ми можемо "вручну" зняти кожне зі "значень стека" і повернути кілька значень за допомогою рекурсивного алгоритму?
А як щодо "від рекурсивного алгоритму до циклу"? Чи можна їх перетворити один на одного (я думаю, що це слід робити теоретично, але я хочу більш точні речі, щоб довести свої думки) .