-7

我正在测试 Python 和 Haskell 的代码密度。所以我决定编写一个程序来求解 ax^2+bx+c=0 形式的方程,其中 a<>0。在 Python 中,这需要五行:

import cmath

def secondgrade(a,b,c):
     d=b**2-4*a*c
     return ((-b+cmath.sqrt(d))/2*a,(-b-cmath.sqrt(d))/2*a)

在 Haskell 中,它应该更简洁,更少冗长,我花了 12 行:

import Data.Complex

csqrt :: Double->Complex Double
csqrt a = if a<0 then 0.0 :+ sqrt(abs(a)) else sqrt(a) :+ 0.0

secondgrade :: Double->Double->Double->(Complex Double,Complex Double)
secondgrade a b c = let d = b^2 - 4*a*c
                    denominator=2*a :+ 0
                    b'=(-b) :+ 0
                    solution1=b'+(csqrt d)
                    solution2=b'-(csqrt d)
                 in (solution1/denominator,solution2/denominator)

有没有行数更少且不失可读性的解决方案?

4

1 回答 1

4

我认为你目前拥有的 Haskell 解决方案比你的 python 版本更好,更易读。您可以重写 Haskell 以匹配 python 版本,如下所示:

import Data.Complex
secondgrade :: Double->Double->Double->(Complex Double,Complex Double)
secondgrade a b c = ((((-b) :+ 0)+(csqrt d))/(2*a :+ 0), (((-b) :+ 0)-(csqrt d))/(2*a :+ 0))
  where d = b^2 - 4*a*c
        csqrt a = if a<0 then 0.0 :+ sqrt(abs(a)) else sqrt(a) :+ 0.0

当然,减少代码行数对我来说似乎很二年级。好的代码易于阅读,不需要破译。

希望这可以帮助!

于 2013-02-16T19:39:35.830 回答