Soluzione problema P2 selezioni scolastiche

Avevo alcuni dubbi sulle soluzioni di un problema delle selezioni scolastiche di quest’anno, ossia il P2.
Se viene stampato il numero 30291 significa che x è uguale a 30291 per “output(x)”. n non viene
modificato mai nella funzione quindi n = x = 30291. A questo punto se eseguiamo le istruzioni seguenti abbiamo:

for i in [0 … 10) do
if x != 0 or i != 0 then
print_numbers(n, 10 * x + i)

quindi il primo “print_numbers” chiamato è print_numbers(30291, 302910), e siccome “x > n” è vero allora
print_numbers(30291, 302910) terminerà per un “return” nullo.
Quindi la risposta giusta non dovrebbe essere la (B) (ossia 30291 è l’ultimo numero stampato)?

Grazie.

Riesci a linkare il testo?

https://scolastiche.olinfo.it/2022/soluzioni
Ecco, è il P2

Il tuo ragionamento è giusto, ma devi pensare che se la funzione ritorna non significa che il codice termina. Infatti print_numbers(30291, 30291) è stata chiamata da una funzione precedente, che continuando il for chiamerà la funzione con altri valori.

Giusto, però anche in questo caso dopo print_numbers(30291,30291) dovrebbe venir chiamata print_numbers(30291, 30292) è anche in questo caso 30292 > 30291 quindi 30291 dovrebbe essere l’ultimo numero stampato. Più che altro non so fin quando andare a ritroso, non sto capendo la gerarchia di esecuzione :sweat_smile:

In effetti è difficile immaginarsi la gerarchia. Hai ragione dicendo che tutte le funzioni chiamate dal for che chiama print_numbers(30291,30291) terminano subito, ma anche la funzione che contiene quel for lì è stata chiamata da una precedente. Piuttosto che immaginarti la gerarchia, cerca di capire in cui ordine la funzione sta stampando i numeri.

Il problema è che non capisco in che ordine stampa (scusami :sweat_smile:)
Se una funzione richiama se stessa in un ciclo for, come viene eseguito il tutto? Si esegue la funzione per tutti i valori nel ciclo in ordine, dopodiché si continua ad andare in profondità partendo dalla prima eseguita e così via? Oppure viene chiamata sul primo valore del for e poi si continua a lavorare lì finche non si arriva ad un caso base, e poi si prosegue con gli altri?
Comunque grazie mille per le risposte :wink:

Esatto, immaginando di chiamare la funzione con f(1, 200) l’output sarebbe:
1
10
100
101
102 … 109
11
110
112 … 119
E poi continua così.

Riesci a capire in che ordine sono i numeri?

Ho capito, grazie mille :wink: . Effettivamente non comprendere questa cosa mi avrebbe limitato parecchio in futuro, quindi doppiamente grazie :smile:

1 Mi Piace