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".