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)?
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
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 )
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