2016-07-29 1 views
0
def roots4(a,b,c,d): 
    d = b * b - 4 * a * c 
    if a != 0 and d == 0: 
     roots4(a,b,c,d) 
     x = -b/ (2*a) 
    if a != 0 and d > 0: 
     roots4(a,b,c,d) 
     x1 = (-b + math.sqrt(d))/2.0/a 
     x2 = (-b - math.sqrt(d))/2.0/a 
    if a != 0 and d < 0: 
     roots4(a,b,c,d) 
     xre = (-b)/(2*a) 
     xim = (math.sqrt(d))/ (2*a) 
     print x1 = xre + ixim 
     strx1 = "x2 = %6.2f + i %6.2f" %(xre, xim) 
     print strx1 

Cela fait partie de mon code pour un projet. Ce que j'essaie de faire est de définir roots4(a,b,c,d). Par exemple, dans le cas où a != 0 and d == 0 puis roots4(a,b,c,d) doit alors aller à trouver x en résolvant l'équation x = -b/ (2*a). Et ainsi de suite ... Je ne sais pas ce que je fais mal. Des conseils?Définition d'une fonction à l'aide de l'instruction if

+3

Pourquoi les appels récursifs? Quel est l'effet désiré, imprimer les solutions ou les retourner? – LutzL

+0

Vous ne devriez pas avoir à passer d comme paramètre – zezollo

+0

Que faites-vous si 'a == 0'? Que voulez-vous dire en résolvant l'équation "x = -b/(2 * a)" (y a-t-il encore vraiment une équation à résoudre?) – zezollo

Répondre

0

Comme souligné dans les commentaires et la réponse de Jimmy, il n'y a pas besoin d'appels récursifs.

Voici un exemple de la façon dont vous pouvez corriger (adapter la façon dont vous le souhaitez):

#!/usr/bin/env python2 
# -*- coding: utf-8 -*- 

import math 


def roots4(a, b, c): 
    """Prints the solutions of ax² + bx + c = 0, if a != 0""" 
    if a == 0: 
     print 'This function is meant to solve a 2d degree equation, '\ 
      'not a 1st degree one.' 
    else: 
     d = b * b - 4 * a * c 
     solutions = [] 
     if d == 0: 
      solutions = [str(-b/(2 * a))] 
     elif d > 0: 
      solutions = [str((-b + math.sqrt(d))/2.0/a), 
         str((-b - math.sqrt(d))/2.0/a)] 
     elif d < 0: 
      xre = str((-b)/(2 * a)) 
      xim = str((math.sqrt(-d))/(2 * a)) 
      solutions = [xre + " + i" + xim, 
         xre + " - i" + xim] 

     print "\nEquation is: {}x² + {}x + {} = 0".format(a, b, c) 

     if len(solutions) == 1: 
      print "There's only one solution: " + solutions[0] 
     else: 
      print "Solutions are: " + " and ".join(solutions) 

roots = [(0.0, 0.0, 0.0), 
     (0.0, 0.0, 1.0), 
     (0.0, 2.0, 4.0), 
     (1.0, 2.0, 1.0), 
     (1.0, -5.0, 6.0), 
     (1.0, 2.0, 3.0)] 

for r in roots: 
    roots4(*r) 

Sortie:

$ ./test_script2.py 
This function is meant to solve a 2d degree equation, not a 1st degree one. 
This function is meant to solve a 2d degree equation, not a 1st degree one. 
This function is meant to solve a 2d degree equation, not a 1st degree one. 

Equation is: 1.0x² + 2.0x + 1.0 = 0 
There's only one solution: -1.0 

Equation is: 1.0x² + -5.0x + 6.0 = 0 
Solutions are: 3.0 and 2.0 

Equation is: 1.0x² + 2.0x + 3.0 = 0 
Solutions are: -1.0 + i1.41421356237 and -1.0 - i1.41421356237 
+0

Je fais quelque chose comme ça! Oui! Sauf mes racines sont: –

+0

(0,0, 0,0, 0,0) \t (0,0, 0,0, 1,0) \t (0.0, 2.0, 4.0) \t (1.0, 2.0, 1.0) \t (1,0, -5,0, 6,0) \t (1.0, 2.0, 3.0) –

+0

Voulez-vous dire que vous obtenez les racines comme tuples? – zezollo

0

Eh bien, il semble que vous ayez fait une boucle infinie avec vos fonctions récursives. Comme il semble maintenant, vous ne ferez jamais de calculs en dehors de

d = b * b - 4 * a * c 

encore et encore.

Considérer le déroulement du programme. Chaque fois que vous atteignez

roots4(a,b,c,d) 

vous finirez à nouveau dans le haut.

1

vous avez probablement empilée avec

... 
      roots4(a,b,c,d) 
    ... 

cette provoque une boucle infinie

Premièrement, pourquoi avez-vous besoin d'un appel de récursivité? quel est le paramètre d pour?

Deuxièmement, qu'est-ce que ixim? devrait-il être quelque chose comme xim * 1j? Qu'attendez-vous de print x1 = xre + ixim?

si vous voulez imprimer uniquement dans le cas où d < 0 ce sera bien

from math import sqrt 


    def roots4(a,b,c): 
     if a != 0.: 
      x_left = -b/(2*a) 

      d = b * b - 4 * a * c 
      if d == 0.: 
       x_right = 0. 
      elif d > 0.: 
       x_right = sqrt(d)/(2 * a) 
      else: 
       xim = sqrt(-d)/(2 * a) 
       strx1 = "x1 = %6.2f + i %6.2f" %(x_left, xim) 
       print strx1 
       strx2 = "x2 = %6.2f - i %6.2f" %(x_left, xim) 
       print strx2 
       x_right = xim * 1j 
      x1 = x_left + x_right 
      x2 = x_left - x_right 
     else: 
      raise ValueError("incorrect leading coefficient in given square equation") 
+0

si vous voulez retourner votre 'x1, x2' vous devriez écrire quelque chose comme' return x1, x2' juste après leur calcul –