[英]Two computationally different ways of computing the maximum of 3 numbers
Q) 编写两个不同的函数maximum1 和maximum2,计算三个数的最大值。 无法使用内置的 max 函数
我有以下代码,这会被认为在计算上有所不同吗?
maximum1:: Int->Int->Int->Int
maximum1 x y z| x> y && x> z = x
|y>x && y>z =y
| otherwise =z
maximum2::Int->Int->Int->Int
maximum2 x y z= head [k | k<-[x,y,z], k>x && k>y || k>x && k>z || k>y && k>z]
maximum1:: Int->Int->Int->Int
maximum1 x y z| x>= y && x>= z = x
|y>=x && y>=z =y
| otherwise =z
maximum2:: Int->Int->Int->Int
maximum2 x y z| x-y>=0 && x-z>=0 = x
|y-x>=0 && y-z>=0 =y
|otherwise =z
第一个更好,因为它不需要列表、过滤器和头部。 如果编译器没有正确优化,这将导致代码效率低下,就 memory 的使用和速度而言。 如果您确实需要一个恰好需要三个 arguments 的 function,那么您的第一个解决方案是可取的。 如果您有值列表,则可以使用以下 function。
maxl :: (Foldable t, Ord b, Bounded b) => t b -> b
maxL = foldl max minBound
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.