#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Wed Oct 6 14:42:57 2021 @author: andrea RECAP: - funzioni, argomenti e variabili locali, argomenti opzionali con valore di default - esempio di ricorsione (albero frattale) TODAY: Come ripetere le stesse operazioni strutture dati indicizzabili (sequenze) - stringhe (immutabili) - liste (mutabili) - tuple (immutabili) - ricorsione e passaggio di argomenti (equivalenza ricorsione iterazione, Iacopini-Bohm) - loops e generatori (enumerate!) Strutture di controllo - if condition: ... elif condition: ... else: ... - for variable in generator/sequence: ... continue # to the next iteration break # from the loop else: ... # if I did not break """ # stampa di una lista usando solo ricorsione e if-then-else def stampa_ricorsiva(lista): if len(lista) == 0: # se la lista è vuota (sono nel caso base) pass # non faccio niente (niente da stampare) else: # altrimenti c'è almeno un elemento print(lista[0]) # stampo il primo elemento resto = lista[1:] # riduco le dimensioni del problema ad una nuova lista più corta stampa_ricorsiva(resto) # stampo il resto (sottoproblema simile) def stampa_ricorsiva2(lista): "visto che il caso base non fa nulla posso toglierlo e rovesciare il test dell'if" if len(lista) > 0: # se non sono nel caso base print(lista[0]) # stampo il primo elemento resto = lista[1:] # riduco le dimensioni del problema stampa_ricorsiva2(resto) # stampo il resto # altrimenti non faccio nulla # esempio stampa_ricorsiva2([2, 5, 7, 4, 1]) # consigliere di dieta # BMI= peso (in kg) /altezza (in metri) ** 2 # (https://www.salute.gov.it/portale/nutrizione/dettaglioIMCNutrizione.jsp?lingua=italiano&id=5479&area=nutrizione&menu=vuoto) # Obesità di III classe (gravissima) >40,00 # Obesità di II classe (grave) 35,01 40,00 # Obesità di I classe (moderata) 30,01 35,00 # Sovrappeso 25,01 30,00 # Regolare 18,51 25,00 # Leggermente sottopeso 17,51 18,50 # Sottopeso 16,01 17,50 # Grave magrezza (inedia) <16,01 def BMI(altezza, peso): '''Calcolo del Body Mass Index (Indice di Massa Corporea)''' # formula return peso/altezza**2 # dietologo1: versione con tanti if # - calcolo il bmi # - se > 40 ... # - se > 35 ... # - se > 30 ... # - se > 25 ... # - se > 18.5 ... # - se > 16 ... # - altrimenti ... def dietologo1(altezza, peso): bmi = BMI(altezza, peso) if bmi > 40: print("overweight 3") elif bmi > 35: print("overweight 2") elif bmi > 30: print("overweight 1") elif bmi > 25: print("sovrappeso") elif bmi > 18.5: print("normale") elif bmi > 16: print("sottopeso") else: print("Starved") # dietologo2: versione più dichiarativa # elenco di 6 limiti # elenco di 7 messaggi # per ogni limite se lo si supera si stampa e si esce # altrimenti ultimo messaggio # FIXME:aggiungere un limite fittizio e semplificare loop def dietologo2(altezza, peso): limiti = [ 40, 35, 30, 25, 18.5, 16 ] messaggi = [ 'o3', 'o2', 'o1', 'S', 'N', 's' ] bmi = BMI(altezza, peso) for indice, limite in enumerate(limiti): if bmi>limite: print(messaggi[indice]) break else: print("Starved") # dietologo3: versione dichiarativa con dizionario # quanto_dimagrire: cercare quanto dimagrire # usando più volte il BMI # - se il BMI > 25 # - si cerca il valore da 0 a peso che, sottratto, porta sotto 25 # - se il BMI < 18.5 # - si cerca il valore da 0 a 100 che, sommato, porta sopra 18.5 # - altrimenti siamo tra 18.5 e 25 # calcolo del BMI inverso def bmi_inverso(altezza, peso): ''' Visto che BMI=peso/altezza**2 possiamo calcolare direttamente di quanto dimagrire/ingrassare per tornare nella fascia di BMI tra 18.5 e 25''' pass