Topic: collatz dubbio  (Letto 305 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline 46

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
collatz dubbio
« il: Agosto 02, 2019, 20:11 »
ciao ragazzi

sto studiando python, sono proprio agli inizi...ed infatti al primo esercizio sono già in difficoltà..
vorrei un aiuto, non la soluzione
l'esercizio è questo:
Scrivete una funzione collatz() che ha un parametro number. Se number è pari, allora collatz() deve stampare number // 2 e restituisce questo valore. Se number è dispari, collatz() deve stampare e restituire 3 * number + 1. Quindi scrivete un programma che consenta all’utente di scrivere un intero e che continui a chiamare collatz() per quel numero fino a che la funzione restituisce il valore 1.

Suggerimento: un number intero è pari se number % 2 == 0, è dispari se number % 2 == 1
L’output di questo programma può essere di questo tipo:
Inserisci un numero:
3
10
5
16
8
4
2
1

fino ad ora ho fatto solo questo:

def collatz(number):
    if number % 2 ==0:
     return number // 2
    else:
     return number*3+1

x=int(input('inserisci un numero :'))
collatz(x)
print(collatz(x))


adesso da quel che  ho capito dovrei mettere un loop while ma non so come richiamare il valore da inserire :question:

che mi dite?

Offline nuzzopippo

  • python habilis
  • **
  • Post: 74
  • Punti reputazione: 0
    • Mostra profilo
Re:collatz dubbio
« Risposta #1 il: Agosto 03, 2019, 09:32 »
La tua funzione va bene, Ti propongo una piccola variante ed il modo d'uso
>>> def collatz(number):
if (number % 2):
return number * 3 + 1
else:
return number // 2


>>> num = int(input('Inserisci un numero : '))
Inserisci un numero : 3
>>> while num != 1:
num = collatz(num)
print(num)


10
5
16
8
4
2
1
>>>


Ciao :)

Offline 46

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
Re:collatz dubbio
« Risposta #2 il: Agosto 03, 2019, 11:13 »
ciao Nuzzopippo

grazie mille..
il mio intoppo era su num=collatz(num)

scrivevo collatz(num)= num e mi dava errore

gentilissimo

Offline 46

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
Re:collatz dubbio
« Risposta #3 il: Agosto 03, 2019, 11:22 »
puoi spiegarmi meglio questo passaggio:

if (number % 2)...
etc

stai scrivendo se il resto del numero inserito dividendolo per 2 è vero
fai x
altrimenti
fai y  ???

scusami ancora

Offline nuzzopippo

  • python habilis
  • **
  • Post: 74
  • Punti reputazione: 0
    • Mostra profilo
Re:collatz dubbio
« Risposta #4 il: Agosto 03, 2019, 12:02 »
In soldoni :

"if" provvede a valutare se una condizione è "Vera" (ossia '"True") oppure "Falsa" (ovvero "False")

Numericamente, un valore "Zero" rappresenta una condizione "False", un valore non-zero una condizione vera, nell'esempio posto viene valutato il valore dell'espressione num % 2 che ha risultato +- 1 per un numero dispari, quindi vero, altrimenti zero, quindi false.

Per maggiori informazioni leggi qui

Offline 46

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
Re:collatz dubbio
« Risposta #5 il: Agosto 03, 2019, 21:36 »
In soldoni :

"if" provvede a valutare se una condizione è "Vera" (ossia '"True") oppure "Falsa" (ovvero "False")

Numericamente, un valore "Zero" rappresenta una condizione "False", un valore non-zero una condizione vera, nell'esempio posto viene valutato il valore dell'espressione num % 2 che ha risultato +- 1 per un numero dispari, quindi vero, altrimenti zero, quindi false.

Per maggiori informazioni leggi qui

 :O
grazie tante ancora

leggo l'articolo...

Offline GlennHK

  • python sapiens sapiens
  • ******
  • Post: 1.655
  • Punti reputazione: 1
    • Mostra profilo
    • La Tana di GlennHK
Re:collatz dubbio
« Risposta #6 il: Agosto 04, 2019, 16:26 »
Le parentesi attorno alla condizione dell'if sono inutili. Python non è java.

Offline nuzzopippo

  • python habilis
  • **
  • Post: 74
  • Punti reputazione: 0
    • Mostra profilo
Re:collatz dubbio
« Risposta #7 il: Agosto 05, 2019, 09:32 »
Le parentesi attorno alla condizione dell'if sono inutili. Python non è java.

Verissimo ed hai fatto bene a segnalarlo :)

Sfuggite senza che neanche me ne rendessi conto (in questo periodo sto aggiornando del vecchio codice, java appunto) ... anche se a dire il vero a volte le uso apposta anche in python, per aiutarmi nella "logica", male non fanno ma è comunque bene non mettere "personalizzazioni".

Ciao

Offline 46

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
Re:collatz dubbio
« Risposta #8 il: Agosto 07, 2019, 21:57 »
 ciao Nuzzo

ti ridisturbo...

in quest altro esercizio che stavo svolgendo:
Supponete di avere un valore lista come questo:
spam = ['mele', 'banane', 'tofu', 'gatti']
Scrivete una funzione che prenda un valore lista come argomento e restituisca una stringa con tutti gli elementi della lista separati da una virgola e uno spazio, con un infine inserito prima dell’ultimo elemento. Per esempio, passando la lista spam a questa funzione, il risultato sarebbe 'mele, banane, tofu, in fine gatti'. La vostra funzione però deve poter funzionare con qualsiasi valore lista le sia passato.


in teoria l'ho svolto
def nuovafunz(alore):
  if alore in spam:
    spam.remove('gatti')
    spam.append('infine')
    spam.append('gatti')
    print(spam[0]+', '+spam[1]+', '+spam[2]+', '+spam[3]+', ' +spam[4])
  else:
    return
   
   
spam=['mele','banane','tofu','gatti']
x=input('inserisci un val. ')
nuovafunz(x)


ma non sono convinto sia esatto...che mi suggerisci?

Offline nuzzopippo

  • python habilis
  • **
  • Post: 74
  • Punti reputazione: 0
    • Mostra profilo
Re:collatz dubbio
« Risposta #9 il: Agosto 08, 2019, 08:53 »
ciao Nuzzo

ti ridisturbo...

ma non sono convinto sia esatto...che mi suggerisci?

Il suggerimento più importante che posso darTi è questo : ragiona bene sul problema, schematizza i passi da fare e risolvilo.

Solo in questo modo imparerai qualcosa, la soluzione fornita da altri la dimenticherai subito.

Comunque, non è bene :
1° inserire un "nuovo" problema in un post già "superato;
2° rivolgersi ad uno specifico utente di un Forum ... questo è un ambiente collaborativo e si collabora un po' tutti mettendo a disposizione ciò che si conosce (oltre tutto io sono uno dei componenti più scarsi).

Detto questo, che non vuole essere un rimprovero ma solo chiarirTi come è bene procedere nell'interesse di tutti (non tutti conosciamo la netiquette dell'ambiente, leggi il regolamento in proposito), passiamo ad esaminare il problema posto ragionando per passi.

il primo dei parametri richiesti è :
Citazione
scrivete una funzione che prenda un valore lista come argomento e restituisca una stringa con ...

Quindi, la funzione non deve fare altro che restituire gli elementi componenti la lista separati da virgola e spazio, nel caso gli elementi della lista è faccenda semplice, si può utilizzare la funzione "join" delle stringhe (cerca e leggi la docs) in questo modo :
>>> def dai_stringa(lst):
return ', '.join(lst[:-1] + ['infine'] + [lst[-1]])

>>> lista = ['mele', 'banane', 'tofu', 'gatti']
>>> stringa = dai_stringa(lista)
>>> print(stringa)
mele, banane, tofu, infine, gatti
>>>


Come noterai, ho usato "pesantemente" i metodi delle liste, che suppongo sia l'obiettivo dell'esercizio (scolastico?) ... se non li conosci trova leggi attentamente la docs, è una attività propedeutica e necessaria per imparare.

... ma vi è la seconda delle condizioni poste :
Citazione
La vostra funzione però deve poter funzionare con qualsiasi valore lista le sia passato.
la funzione "dai_stringa" non funzionerebbe se nella lista passata quale paramentro vi fosse, ad esempio, un valore numerico od un oggetto "non stringa" qualsiasi ... ci può venire in aiuto la funzione built-in "str()" (trova e leggi la docs), convertendo tutti i valori della lista "parametro" in stringhe organizzate in una nuova lista e lavorare quest'ultima, p.e. così :
>>> def dai_stringa(lst):
my_lst = []
for elem in lst:
my_lst.append(str(elem))
return ', '.join(my_lst[:-1] + ['infine'] + [my_lst[-1]])

>>> lista = ['mele', 1, 'banane', 'tofu', 'gatti', 2]
>>> stringa = dai_stringa(lista)
>>> print(stringa)
mele, 1, banane, tofu, gatti, infine, 2


Se Tu avessi applicato la lista di questo secondo esempio con la funzione definita nel primo avresti avuto un errore
Citazione
TypeError: sequence item 1: expected str instance, int found

Ciao

Offline 46

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
Re:collatz dubbio
« Risposta #10 il: Agosto 10, 2019, 22:44 »
ciao

innanzitutto scusami, mi sono reso conto del pasticcio subito dopo aver postato

ti ringrazio per la soluzione anche se c'è qualche passaggio che devo capire meglio
 probabilmente non ho ben capito cosa richiedeva il problema

grazie ancora

Offline 46

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
Re:collatz dubbio
« Risposta #11 il: Agosto 13, 2019, 10:37 »
ciao

"chiudo" il topic visto che ho studiato sia il problema che la soluzione proposta sopra
finalmente ho capito ( ci ho messo un po' troppo), l'unico rimpianto è non esserci arrivato solo...
soprattutto la parte col for per creare una nuova lista e trasformare tutti gli elementi in stringhe ... peccato :confused:

per completezza allego il mio codice

def agg_stringa(lista):
        lista.insert(-1,'infine')
        nuova=[]
        for elem in lista:
                nuova.append(str(elem))
        return ', '.join(nuova)

spam=['mele',1,'banane','tofu','gatti']
c=agg_stringa(spam)
print(c)


grazie ancora per il preziosissimo supporto
spero di  migliorare col tempo  anche per questi esercizi scolastici

Offline nuzzopippo

  • python habilis
  • **
  • Post: 74
  • Punti reputazione: 0
    • Mostra profilo
Re:collatz dubbio
« Risposta #12 il: Agosto 14, 2019, 09:07 »
ti ringrazio per la soluzione anche se c'è qualche passaggio che devo capire meglio

Forse, il passaggio che Ti lascia dubbi è questa istruzione?
 ', '.join(lst[:-1] + ['infine'] + [lst[-1]])


Si tratta della effettuazione di uno join su di una lista composta sommando porzioni della lista originaria con un inserto di una lista composta da un singolo elemento. Sono metodi di base delle liste, forse non li hai ancora affrontati, purtroppo è difficile intuire quali sono le Tue conoscenze al momento, se Ti occorrono notizie in merito a tale operazione, guarda questa pagina,, il punto 8.7 in particolare, ma senza fretta segui coerentemente il Tuo percorso,

Giusto per Tua informazione ma solo per sapere, avanzando nella comprensione del linguaggio scoprirai l'esistenza di metodi più avanzati che permetterebbero ulteriori cose, non approfondire al momento ma, p.e., tutta la funzione potrebbe essere ridotta in una sola istruzione, combinando le " list comprehension" alla precedente istruzione, vedi già :

>>> lista = ['mele', 'banane', 'tofu', 'gatti']
>>> ', '.join([str(x) for x in lista][:-1] + ['infine'] + [[str(x) for x in lista][-1]])
'mele, banane, tofu, infine, gatti'
>>>


Ciao, e buon strudio :)

Offline gila75

  • python unicellularis
  • *
  • Post: 13
  • Punti reputazione: 0
    • Mostra profilo
Re:collatz dubbio
« Risposta #13 il: Settembre 16, 2019, 21:39 »
Non so se è molto pythonico, ma se un numero è pari o dispari, si puo testare anche così:

>>> a=5
>>> a&1
1
>>> a=4
>>> a&1
0


Forse risulta più veloce che l'operatore modulo(%), ma ripeto, magari in python non è molto consigliato. Sentiamo i pareri
« Ultima modifica: Settembre 16, 2019, 21:44 da gila75 »