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 relativo ricorsivo è:
int GetTotal(int number)
{
if (number==1) return 1; //The end number
return number+GetTotal(number-1); //The inner recursive
}
E infine per semplificare questo, è 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 rispondere e analizzare. Quello che voglio sapere è:
1) Possiamo ottenere un "modo comune generale" per convertire un loop (per / mentre ……) in ricorsivo? E a quali tipi di cose dovremmo prestare attenzione mentre facciamo la conversione? Sarebbe meglio scrivere informazioni dettagliate con alcuni esempi e le tue teorie persudo, nonché il processo di conversione.
2) "Ricorsivo" ha due forme: ricorsivamente lineare e ricorsivo di coda. Quindi quale è meglio convertire? Quale "regola" dovremmo padroneggiare?
3) A volte abbiamo bisogno di mantenere la "storia" ricorsiva, questo può essere fatto facilmente in un'istruzione di ciclo:
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 di seguito è:
Il risultato di 1 è 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 ricorsività si concentra su come ottenere l'ultimo risultato e fare un ritorno di richiamata. Quindi, tutto ciò avviene attraverso lo stack gestito dal linguaggio di programmazione che assegna automaticamente la memoria sotto forma di stack. E come possiamo "estrarre" manualmente ciascuno dei "valori dello stack" e restituire più valori attraverso un algoritmo ricorsivo?
E che dire di "da un algoritmo ricorsivo a un ciclo"? Possono essere convertiti l'uno nell'altro (penso che dovrebbe essere fatto teoricamente, ma voglio cose più precise per dimostrare i miei pensieri) .