Di principio l'idea di inizializzare un vettore od una matrice è buona perchè riduce i tempi di esecuzione del codice, tuttavia non è "obbligatorio" e nel tuo caso non vedo come possa essere possibile.
Considerando il tipo di problema che devi risolvere, l'inizializzazione del vettore non è un problema, la curva esponenziale cresce molto velocemente e, a mono di non scegliere un valore di "N" molto grande e uno di "a" molto piccolo, il vettore risultante avrà pochi elementi.
Per quanto riguarda il codice che hai scritto:
[*] ottima l'idea di inserire un controllo sul valore di "a", potresti aggiungerne uno per "N"
[*] dal momento che se il valore di "a" è "<" la funzione genera un errore (vedi punto precedente) il blocco "if" nella funzione non serve, se "a" supera il controllo di errore, sarà per forza ">=2"
[*] i due loop non sono necessari e, anche ammesso di conoscere il valore di "n" (e non lo conosciamo) creano potenzialmente un loop infinito; infatti, nel ciclo "while" interno il valore di "i" non cambia, per cui, se alla prima iterazione la condizione "a^i<=N" è verificata, il ciclo while si ripeterà all'infinito
Dal momento che non si conosce il valore di "n" che fa terminare l'esecuzione della fnzione, quello che puoi fare è:
[*] creare un contatore (es. "pow_val") che verrà incrementato ad ogni iterazione del ciclo while
[*] creare un ciclo while "infinito", nel senso che la sua condizione è sempre verificata
[*] effettuare il calcolo "a^pow_val e verificare se il risultato sia "<=N": se sì aggiungi il valore al vettore di output, in caso contrario usi l'istruzione "break" per forzare l'uscita dal ciclo while
[*] il contatore, oltre che per calcolare il valore della potenza, va usato come indice per accedere al vettore
pow_val=0
while(1)
tmp=a^pow_val
if(tmp <= N)
v(pow_val+1)=tmp
pow_val=pow_val+1
else
break
end
end