一直在处理一些haskell问题,被困在这两个问题上,答案很简单,但我的大脑无法解决问题。
编写一个函数,确定其三个参数中有多少相等(即返回0,2或3)。
howManyEqual :: Int -> Int -> Int -> Int
howManyEqual x y z
| x == y && x == z && y == z = 3
|
编写一个函数,它返回三个整数参数中有多少个大于它们 平均值。
howManyAboveAverage :: Int -> Int -> Int -> Int
howManyAboveAverage x y z
| x > average(x y z) && y > average(x y z) && z > average(x y z) = 3
where
average a b c = ((a + b + c) / 3)
有人可以帮我完成这些:)
感谢
答案 0 :(得分:2)
编辑为第一个解决方案有点过分:)
第一种解决方案只使用普通警卫:
howManyEqual :: Int -> Int -> Int -> Int
howManyEqual x y z
| x == y && y == z = 3
| x /= y && x /= z && y /= z = 0
| otherwise = 2
第二种解决方案使用一些基本功能,如过滤器和长度。
howManyAboveAverage :: Int -> Int -> Int -> Int
howManyAboveAverage x y z = length . filter (>average) $ [x,y,z]
where average = (x + y + z) `div` 3
在这种情况下,我认为整数除法div
不会成为问题。它会截断小数,但看到输入仍然是整数:
x> avg意味着x> (平均)和
x&lt; = avg意味着x <= floor(avg)
希望有效!如果您有任何问题,请告诉我。
答案 1 :(得分:1)
您最好在第一个任务maximum
和
import Data.List (group,sort)
是你的朋友
howManyEqual x y z = "length of longest group of equal things" - 1
howManyAboveAverage x y z = let xs = [x,y,z]
avg = undefined -- you can do that
in length $ "get all elements > average from" xs
在第二部分中,名为filter
的函数很有用。
我知道这不是有效的haskell代码,但它可以帮助你解决这个问题。
然后你必须在第一种情况下写一点,在第二种情况下 - 过滤器在标准库中
howManyEqual :: Int -> Int -> Int -> Int
howManyEqual x y z
| x == y && x == z = 3
| x == y && x /= z = 2
| x z && y z = 2
| x y && y z = 2
| otherwise = 0