No. * Qualsiasi algoritmo senza loop deve essere O(1)
, perché sai al momento della compilazione quanti passi l'algoritmo richiederà (al massimo).
A meno che per "usare un loop" intendi effettivamente scrivere una delle istruzioni di iterazione C #: for
, foreach
, do
o while
. Poi ovviamente ci sono altri modi, ma direi che sono solo modi diversi di fare un ciclo. Ad esempio:
i = 0;
Outer:
j = 0;
Inner:
//do something N^2 times.
j++;
if (j < N) {
goto Inner;
}
i++;
if (i < N) {
goto Outer;
}
Questo è il tuo stesso ciclo scritto con goto
. O che ne dici di questo:
Enumerable.Range(0, N).SelectMany(i =>
Enumerable.Range(0, N).Select(j => { /*do something N^2 times*/ })
).ToList();
C'è lo stesso ciclo usando Enumerable
metodi ed estensioni. Conta se l'implementazione di ToList
utilizza un ciclo?
* A seconda di come conti la ricorsione
Sicuramente c'è da sostenere che la ricorsione è semplicemente "diversa" dall'iterazione, ma ogni algoritmo ricorsivo può essere convertito in un equivalente iterativo. In effetti sarebbe perfettamente ragionevole per un compilatore farlo. Il tuo algoritmo "usa un ciclo" se è logicamente equivalente a un algoritmo che utilizza un ciclo? Dipende esattamente da cosa intendi per "algoritmo".