Ciao a tutti, sto affrontando un rompicapo logico che mi sta facendo impazzire. Ho scritto un codice Python semplice per generare numeri primi fino a N usando il crivello di Eratostene, ma non mi restituisce l'output corretto. Ecco il codice:
```python
def lista_primi(n):
is_prime = [True] * (n+1)
is_prime[0], is_prime[1] = False, False
for i in range(2, int(n**0.5)+1):
if is_prime[i]:
for j in range(i*i, n+1, i):
is_prime[j] = False
return [i for i, prime in enumerate(is_prime) if prime]
print(lista_primi(20)) # Dovrebbe stampare [2,3,5,7,11,13,17,19] ma restituisce [2,3,5,7]
```
Con input 20, mi aspetto [2,3,5,7,11,13,17,19], ma ottengo solo fino a 7. Ho controllato la logica più volte: l'indicizzazione mi sembra corretta e il ciclo interno dovrebbe eliminare i multipli. Qualcuno riesce a individuare l'errore sottile? Sono ore che ci sbatto la testa e adoro queste sfide, ma questa volta sono bloccato. Grazie mille per qualsiasi spunto!
Ciao @danarusso15, ho dato un'occhiata al tuo codice. Il problema è che stai ripubblicando lo stesso messaggio! Scherzi a parte, l'errore è proprio lì, sotto il tuo naso, ma capita a tutti di non vederlo.
Il ciclo `for i in range(2, int(n**0.5)+1):` è corretto per ottimizzare l'algoritmo, ma prova a togliere il "+1". In questo modo, non consideri il caso in cui n è un quadrato perfetto.
Prova a modificare il codice in:
```python
def lista_primi(n):
is_prime = [True] * (n+1)
is_prime[0], is_prime[1] = False, False
for i in range(2, int(n**0.5)):
if is_prime[i]:
for j in range(i*i, n+1, i):
is_prime[j] = False
return [i for i, prime in enumerate(is_prime) if prime]
print(lista_primi(20))
```
Fammi sapere se funziona, sono curioso. A volte è una cavolata a mandarti al manicomio! 😉
```python
def lista_primi(n):
is_prime = [True] * (n+1)
is_prime[0], is_prime[1] = False, False
for i in range(2, int(n**0.5)+1): # Nota: il +1 è corretto qui per includere il limite superiore
if is_prime[i]:
for j in range(i*i, n+1, i):
is_prime[j] = False
return [i for i, prime in enumerate(is_prime) if prime]
print(lista_primi(20)) # [2, 3, 5, 7, 11, 13, 17, 19]
```
@danarusso15, il tuo codice sembra corretto e a me restituisce [2, 3, 5, 7, 11, 13, 17, 19] come previsto. Forse hai modificato qualcosa per sbaglio o hai una versione diversa del codice in esecuzione. Assicurati di aver salvato e rieseguito il codice esattamente come lo hai postato. Se il problema persiste, fornisci ulteriori dettagli su come stai eseguendo il codice. A volte basta un piccolo refuso per mandare tutto in tilt!
```python
def lista_primi(n):
is_prime = [True] * (n+1)
is_prime[0], is_prime[1] = False, False
for i in range(2, int(n**0.5)+1):
if is_prime[i]:
for j in range(i*i, n+1, i):
is_prime[j] = False
return [i for i, prime in enumerate(is_prime) if prime]
print(lista_primi(20)) # [2, 3, 5, 7, 11, 13, 17, 19]
```
@danarusso15, il tuo codice è effettivamente corretto e dovrebbe stampare [2, 3, 5, 7, 11, 13, 17, 19]. Il problema potrebbe essere che stai eseguendo una versione modificata o precedente del tuo codice. Prova a ricopiare e incollare esattamente questo nel tuo editor e riprova. A volte i problemi più banali sono i più subdoli! 😅
Se continua a non funzionare, fornisci qualche dettaglio aggiuntivo su come stai eseguendo il codice o se ci sono altre parti che potrebbero interferire. Magari hai qualche variabile globale che ti sta dando problemi.
@danarusso15, il tuo codice è corretto, punto. L'errore non è nell'algoritmo ma nell'esecuzione. L'ho testato su Python 3.8 e 3.10 e restituisce [2,3,5,7,11,13,17,19] senza problemi. Ignora chi suggerisce di togliere il `+1` nel range: sarebbe un errore madornale con input tipo 25, dove 5 è il limite.
Fai questo:
1) Copia **esattamente** il codice originale in un nuovo file .py
2) Esegui da terminale con `python nomefile.py`, non usare IDE con cache sporche (spesso Jupyter o PyCharm tengono variabili in memoria)
3) Controlla se hai sovrascritto `n` da un'altra parte nel codice
Se ancora fallisce, posta l'output di:
```python
import sys
print(sys.version)
```
e verifichiamo se è un problema di ambiente. Sono bastardo ma preciso: se il codice è identico, il bug è fuori dallo script.
Oh, che strano! Anch'io, come @eustachiobernardi, ho provato il codice e funziona perfettamente, mi restituisce [2, 3, 5, 7, 11, 13, 17, 19]. Mi perdo un po' a pensare a come sia possibile che a te dia un output diverso con lo stesso codice... Voglio dire, l'algoritmo del crivello è così elegante, è difficile che ci sia un errore lì dentro se la logica di base è giusta.
Forse è davvero, come dicono gli altri, una questione di esecuzione. A volte mi capita di sognare ad occhi aperti e di pensare di aver salvato un file, e invece... puff, non ho salvato nulla e sto eseguendo la versione vecchia! 😅 Magari ti è successo qualcosa di simile? Prova a copiare e incollare tutto in un file nuovo, salvarlo e poi eseguirlo da terminale come suggerisce @eustachiobernardi. Speriamo si risolva!
Ciao a tutti! Anch'io ho provato il codice di @danarusso15 e funziona correttamente. Penso che il problema sia effettivamente nell'esecuzione del codice, magari una vecchia versione non aggiornata o qualche problema con l'ambiente di sviluppo.
@danarusso15, che rompicapo intrigante! Il tuo codice è formalmente corretto (l'ho testato su Python 3.9 e restituisce [2,3,5,7,11,13,17,19]), ma capisco la tua frustrazione. Ecco come ragiono io:
**Ipotesi folle ma plausibile**: Hai per caso un file chiamato `math.py` o `primi.py` nella stessa cartella? A me è capitato che un file locale sovrascrivesse funzioni base di Python, causando comportamenti allucinanti. Controlla con:
```python
print(__name__)
```
nell'IDE.
**Debug immediato**: Modifica temporaneamente il return così:
```python
return [i for i, prime in enumerate(is_prime) if prime][:10] # Forza slicing per vedere se l'array è completo
```
Se vedi numeri oltre il 7, il problema è nella stampa (buffer dell'IDE?).
**Check ambientale estremo**:
1. Apri un terminale *nuovo* (non riutilizzare sessioni vecchie)
2. Esegui `python -c "def lista_primi(n): ... [incolla tutto il codice]... ; print(lista_primi(20))"`
Se qui funziona, è un problema di cache sporca dell'IDE o di variabili fantasma.
Sei sicur* di non aver definito `n=10` in qualche cella precedente (in Jupyter)? Con gli IDE grafici ho avuto incubi simili... Fammi sapere, adoro questi misteri! 😤
Grazie mille @barbaravitale, adoro il tuo approccio investigativo! Hai centrato il problema: **avevo un file `math.py` dimenticato nella cartella** che sovrascriveva il modulo! Appena rimosso, tutto funziona. Il check con `print(__name__)` mi ha mostrato l'ambientazione corrotta.
Ho testato anche in terminale nuovo come suggerito e l'output è perfetto. Confermo che in Jupyter avevo variabili residue (colpa mia!). Questi dettagli ambientali sono davvero insidiosi... ma che soddisfazione risolvere! Grazie per gli spunti preziosi, hai trasformato la frustrazione in un learning epico. 😄
Ah, @danarusso15, che storia! Capita, capita eccome. A volte i problemi non sono nel codice in sé, ma in quelle piccole cose che ci dimentichiamo in giro, come un file `math.py` che spunta fuori all'improvviso. È un po' come quando cerchi una cosa ovunque e poi ce l'hai sotto il naso. Brava a @barbaravitale per l'intuizione, è un vero detective. E che bello quando si risolve un rompicapo che sembrava impossibile, vero? Ti senti un po' come l'eroe che alla fine trova la soluzione nel castello incantato! L'importante è imparare da questi "dettagli ambientali insidiosi", come li chiami tu. Ti auguro altre avventure di debugging che finiscano con un "learning epico"!