Domanda correzione es python

markito

Utente Iron
3 Marzo 2021
23
7
2
19
salve a tutti scrivo per chiedere quà su inforge una soluzione più concisa per un esercizio svolto.
l'esercizio in questione è questo:
Immagine 2021-08-18 224708.png


il ciclo del paragrafo a cui si riferisce è questo:

Codice:
while True:
    print(x)
    y = (x + a/x) / 2
    if y == x:
        break
    x = y

e questa è la mia soluzione:

Python:
import math
def mia_radq(a):
    x = a/2
    while True:
        y = (x + a/x) / 2
        if y == x:
            return round(y,10)
            break
        x = y
        
def math_sqrt(n):
    return round(math.sqrt(n),10)

def test_radq(n):
    e='a'
    f='mia_radq(a)'
    g='math.sqrt(a)'
    h='diff'
    b=' '*10
    print(e+b+f+b+g+b+h)
    print('-'*len(e)+b+'-'*(len(f)-1)+'-'+b+'-'*len(g)+b+'-'*len(h))
    c=1.0
    while True:
        print(str(c)+' '*(10+len(e)-len(str(c)))+str(mia_radq(c))+' '*(10+len(f)-len(str(mia_radq(c))))+str(math_sqrt(c))+' '*(10+len(g)-len(str(math_sqrt(c))))+str(abs(mia_radq(c)-math_sqrt(c))))
        if c == n:
            break
        c=c+1.0

test_radq(9)

con risultato questo:

Codice:
a          mia_radq(a)          math.sqrt(a)          diff
-          -----------          ------------          ----
1.0        1.0                  1.0                   0.0
2.0        1.4142135624         1.4142135624          0.0
3.0        1.7320508076         1.7320508076          0.0
4.0        2.0                  2.0                   0.0
5.0        2.2360679775         2.2360679775          0.0
6.0        2.4494897428         2.4494897428          0.0
7.0        2.6457513111         2.6457513111          0.0
8.0        2.8284271247         2.8284271247          0.0
9.0        3.0                  3.0                   0.0

so benissimo che la mia soluzione non sia la migliore anche se funziona, inoltre penso di aver scritto una riga esagerata alla riga 24 per questo volevo un attimo vedere quali altre soluzioni c'erano.

grazie in anticipo.

markito
 
Il break preceduto dal return lo puoi anche rimuovere, è dead code.
Python:
def test_radq(n):
    fmt = '{:<3}\t{:<13}\t{:<13}\t{:<13}'
    print(fmt.format("a", "mia_radq(a)", "math.sqrt(a)", "diff"))
    print(fmt.format("_", "___________", "____________", "____"))
    for i in range(1,n):
        a = float(i)
        mia = round(mia_radq(a), 11)
        mat = round(math.sqrt(a), 11)
        print(fmt.format(a, mia, mat, abs(mia-mat)))
 
Il break preceduto dal return lo puoi anche rimuovere, è dead code.
Python:
def test_radq(n):
    fmt = '{:<3}\t{:<13}\t{:<13}\t{:<13}'
    print(fmt.format("a", "mia_radq(a)", "math.sqrt(a)", "diff"))
    print(fmt.format("_", "___________", "____________", "____"))
    for i in range(1,n):
        a = float(i)
        mia = round(mia_radq(a), 11)
        mat = round(math.sqrt(a), 11)
        print(fmt.format(a, mia, mat, abs(mia-mat)))
grazie, ora è molto più conciso.
giusto per chiarire, quel "/t" che metti nel formato spazia i valori come se premesse il tasto tabs giusto?
e poi ho visto che il comando for i in range(1,n): ferma il programma ad un numero prima di n; per risolvere c'è un qualche comando particolare che mi comprenda n, o mi limito a trasformarlo in for i in range(1,n+1)?
grazie ancora.