Questo problema si concentra principalmente sull'algoritmo, forse qualcosa di astratto e più accademico.
L'esempio offre un pensiero, voglio un modo generico, quindi l'esempio è usato solo per renderci più chiari sui tuoi pensieri.
In generale, un loop può essere convertito in ricorsivo.
per esempio:
for(int i=1;i<=100;++i){sum+=i;}
E il suo ricorsivo correlato è:
int GetTotal(int number)
{
if (number==1) return 1; //The end number
return number+GetTotal(number-1); //The inner recursive
}
Infine, per semplificare ciò, è necessario un ricorsivo di coda:
int GetTotal (int number, int sum)
{
if(number==1) return sum;
return GetTotal(number-1,sum+number);
}
Tuttavia, la maggior parte dei casi non è così facile da rispondere e analizzare. Quello che voglio sapere è:
1) Possiamo ottenere una "generale maniera comune" per convertire un ciclo (per / mentre ......) in un ricorsivo? E a che tipo di cose dovremmo prestare attenzione mentre facciamo la conversione? Sarebbe meglio scrivere informazioni dettagliate con alcuni esempi e le teorie di persudo, nonché il processo di conversione.
2) "Ricorsivo" ha due forme: ricorsiva lineare e ricorsiva della coda. Quindi, quale è meglio convertire? Quale "regola" dovremmo padroneggiare?
3) A volte abbiamo bisogno di mantenere la "cronologia" di ricorsiva, questo è facilmente eseguibile in un'istruzione di loop:
per esempio:
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);
}
}
Il risultato sotto è:
Il risultato di1 è 1.
Il risultato di 1 + 2 è 3.
Il risultato di 1 + 2 + 3 è 6 ............
Tuttavia penso che sia difficile mantenere la cronologia in modo ricorsivo, perché un algoritmo basato su ricorsiva si concentra sull'ottenimento dell'ultimo risultato e sul ritorno della richiamata. Quindi, tutti questi sono fatti attraverso lo stack gestito dal linguaggio di programmazione che assegna automaticamente la memoria sotto forma di stack. E come possiamo "manualmente" prelevare ciascuno dei "valori dello stack" e restituire più valori tramite un algoritmo ricorsivo?
E che dire "da un algoritmo ricorsivo a un loop"? Possono essere convertiti l'un l'altro (penso che dovrebbe essere fatto teoricamente, ma voglio cose più accurate per provare i miei pensieri) .