2016-07-29 16 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 

これはプロジェクトのコードの一部です。私がしようとしているのはroots4(a,b,c,d)です。例えば、a != 0 and d == 0の場合、roots4(a,b,c,d)は、式x = -b/ (2*a)を解くことによってxを見つけることに行きます。それで...私は何が間違っているのか分かりません。任意のヒント?if文を使用して関数を定義する

+3

なぜ再帰呼び出し罰金になりますときd < 0場合のみで印刷したい場合は?ソリューションを印刷するか、それを返すかは、どのような効果がありますか? – LutzL

+0

パラメータとしてdを渡す必要はありません – zezollo

+0

'a == 0'なら何をしますか?あなたは式 "x = -b /(2 * a)"を解くことで何を意味するのですか?(解決する方程式はまだ本当ですか?) – zezollo

答えて

0

コメントとジミーの答えに指摘されているように、再帰呼び出しは必要ありません。ここで

は(それをあなたが好きなように適応させる)あなたはそれを修正することができる方法の例です:

#!/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) 

出力:

$ ./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

私はこのような何かをやっている!はい!私のルーツを除き、次のとおりです。 –

+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

あなたはタプルとして根を得るのですか? – zezollo

0

まあ、再帰関数で無限ループを作ったようです。今のところ、あなたは決して計算をしません。

何度も何度も繰り返します。

プログラムフローを検討してください。

に到達するたびに
roots4(a,b,c,d) 

あなたはもう一度上になります。

1

あなたはおそらく

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

これに積み重ねられました無限ループを引き起こす

第一に、なぜ再帰呼び出しが必要ですか? dのパラメータは何ですか?

次に、iximとは何ですか?それはxim * 1jのようなものでしょうか? print x1 = xre + iximには何がありますか?

あなたは、これが

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

'x1、x2'を返そうとするなら、計算の直後に' return x1、x2'のようなものを書くべきです –

関連する問題