Dieses Problem konzentriert sich hauptsächlich auf den Algorithmus, vielleicht etwas Abstraktes und Akademischeres.
Das Beispiel bietet einen Gedanken, ich möchte einen generischen Weg, also wird das Beispiel nur verwendet, um uns klarer über Ihre Gedanken zu informieren.
Im Allgemeinen kann eine Schleife in eine rekursive umgewandelt werden.
z.B:
for(int i=1;i<=100;++i){sum+=i;}
Und das damit verbundene rekursive ist:
int GetTotal(int number)
{
if (number==1) return 1; //The end number
return number+GetTotal(number-1); //The inner recursive
}
Und schließlich, um dies zu vereinfachen, wird ein Schwanzrekursiv benötigt:
int GetTotal (int number, int sum)
{
if(number==1) return sum;
return GetTotal(number-1,sum+number);
}
Die meisten Fälle sind jedoch nicht so einfach zu beantworten und zu analysieren. Was ich wissen möchte ist:
1) Können wir einen "allgemeinen Weg" finden, um eine Schleife (für / während ...) in eine rekursive zu konvertieren? Und auf was sollten wir bei der Bekehrung achten? Es wäre besser, detaillierte Informationen mit einigen Beispielen und Ihren Persudo-Theorien sowie dem Konvertierungsprozess zu schreiben.
2) "Rekursiv" hat zwei Formen: rekursiv und rekursiv. Also was ist besser zu konvertieren? Welche "Regel" sollen wir meistern?
3) Manchmal müssen wir die "Geschichte" von rekursiv halten, dies kann leicht in einer Schleifenanweisung gemacht werden:
z.B:
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);
}
}
Das folgende Ergebnis ist:
Das Ergebnis von 1 ist 1.
Das Ergebnis von 1 + 2 ist 3.
Das Ergebnis von 1 + 2 + 3 ist 6 …………
Ich denke jedoch, dass es schwierig ist, den Verlauf rekursiv zu halten, da sich ein rekursiv basierter Algorithmus darauf konzentriert, das letzte Ergebnis zu erhalten und einen Rückruf durchzuführen. All dies geschieht also über den Stapel, der von der Programmiersprache verwaltet wird, die den Speicher automatisch in Form eines Stapels zuweist. Und wie können wir "manuell" jeden der "Stapelwerte" herausnehmen und mehrere Werte durch einen rekursiven Algorithmus zurückgeben?
Und was ist mit "von einem rekursiven Algorithmus zu einer Schleife"? Können sie ineinander umgewandelt werden (ich denke, das sollte theoretisch gemacht werden, aber ich möchte genauere Dinge, um meine Gedanken zu beweisen) .