我坚持了两个haskell问题

时间:2013-11-02 16:12:54

标签: haskell

一直在处理一些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)

有人可以帮我完成这些:)

感谢

2 个答案:

答案 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