【问题标题】:Minimum or small enough最小或足够小
【发布时间】:2013-04-08 06:37:21
【问题描述】:

我正在为简单的棋盘游戏编写 Haskell 求解器。我有这个功能:

bestMove :: Board -> (Int,Int)
bestMove brd = minimumBy (comparing $ length.choices brd) (remaining brd)

基本上 bestMove 是一种在剩余移动中留下最少选择的移动。然而,我知道没有任何元素会留下少于一种选择。如果找到这样的移动,我该如何编写这个函数来终止搜索最小值?
换句话说,我想要一个返回最小或第一次遇到的元素的函数,该元素足够小(不遍历列表的其余部分)。

这是我的第一个 Haskell 程序,所以它可能非常基础。它是一个回溯求解器,因此不要在一个被调用数百万次的函数中遍历整个列表。

【问题讨论】:

    标签: list haskell minimum


    【解决方案1】:

    我会简化你的问题,因为你没有为你的某些函数提供类型:

    在已知最小值的情况下,如何编写一个函数来获取列表的最小值?

    这样的函数应该有类型:

    minimum' :: (Ord a) => a -> [a] -> a
    

    ... 其中第一个参数是已知的下限(即 1 个选项),第二个参数是要搜索的列表。

    我们可以通过组合两个更简单的函数来定义这个函数。第一个函数只是简单地从列表中获取所有元素,直到它到达下限或列表末尾:

    chop :: (Ord a) => a -> [a] -> [a]
    chop minElem as =
        let (prefix, suffix) = span (> minElem) as
        in  case suffix of
                []      -> prefix
                s:uffix -> prefix ++ [s]
    

    然后我们用最小值组成它:

    minimum' minElem = minimum . chop minElem
    

    这是函数式编程中的一种常见模式:组合简单的解决方案来解决复杂的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 2011-12-05
      • 2018-09-18
      相关资源
      最近更新 更多