我正在测试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中,它应该更简洁,更简洁,它花了我十二行:
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)
是否有任何解决方案,线路更少且可读性不会下降?
答案 0 :(得分: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
当然,减少代码中的行数似乎对我来说是二年级。好的代码很容易阅读,不需要破译。
希望这有帮助!