0

特定のポイントで最小距離((x1、x2)および(y1、y2)distance = abs(y2-y1)+ abs(x2-x1)を持つタプル(1つ以上)を見つけようとしました。例 :

リストは[(1,2)、(3,4)、(5,4)、(5,6)、(9,12)]になります

具体的なポイントは(xpos、ypos)=(4,4)です。

次に、関数は[(3,4)、(5,4)]を返すはずです。これを実装しようとしましたが、ある種の問題があり、ベースケースに関連していると思います。私を助けてくれる人はいますか?

disSolver xpos ypos coor = abs (xpos - (fst coor)) +abs(ypos-(snd coor))



closestTuple _ _ [] =[]
closestTuple xpos ypos (x:y:xs) = if (disSolver xpos ypos x)<= (disSolver xpos ypos y)
then [x] ++ closestTuple xpos ypos (xs)
else closestTuple xpos ypos (y:xs)

前もって感謝します !

4

2 に答える 2

3

あなたはdisSolverそれ自身の機能を考慮に入れました、それは良いことです。さらに進んで、「指定されたメトリックによって最小値を見つける」ためのアルゴリズムを抽象化することもできます。closestTupleその場合、2つの構成にすぎません。(タイプがよりよく適合するため、私distSolverがあなたの代わりにleventovを使用していることを除いて。)disSolver

minimaByこの場合、より明確でエラーが発生しにくいと思うので、明示的なパターンマッチングと再帰の代わりに、関数のパイプラインを使用してデモンストレーションすることを選択しました。

また、私が指定したタイプはminimaBy、コンパイルすると、特定のバグが自動的に発生しないことを意味します。を実装するように宣言されているだけなので、誤ってcタイプ(の署名に対応)(a, a)でソートすることはできません。closestTuplebOrd

(とは言っても、私はこのコードをコンパイルしたりテストしたりしていませんが、頭の中で完璧に動作することが保証されているだけです:-))

import Control.Arrow ((&&&))
import Data.Function (on)
import Data.List (groupBy, sortBy)
import Data.Maybe (fromMaybe, listToMaybe)
import Data.Ord (comparing)

minimaBy :: Ord b => (c -> b) -> [c] -> [c]
minimaBy f = map fst
           . fromMaybe []
           . listToMaybe
           . groupBy ((==) `on` snd)
           . sortBy (comparing snd)
           . map (id &&& f)

closestTuple :: (Num a, Ord a) => (a, a) -> [(a, a)] -> [(a, a)]
closestTuple = minimaBy . distSolver

ドキュメントへのリンク:

  • Control.Arrow ---&&&
    • 今のところ型クラスを無視する
    • そのふりをする(&&&) :: (b -> c) -> (b -> c') -> (b -> (c, c'))
  • Data.Function ---on
  • Data.List --- groupBysortBy
  • Data.Maybe --- fromMaybelistToMaybe
  • Data.Ord ---comparing
于 2013-03-24T11:53:20.357 に答える
1

最も近いポイントを見つけるためのリストに正確に1つの要素が含まれている場合を見逃しました。また、closestTuple実装のロジックにバグがあるようです。

これが私が関数を書く方法です:

distSolver :: Num a => (a, a) -> (a, a) -> a
distSolver (px, py) (x, y) = (abs (x - px)) + (abs (y - py))

closestTuple :: (Num a, Ord a) => (a, a) -> [(a, a)] -> [(a, a)]
closestTuple _ [] = []
closestTuple pos (x:xs) = mins (distSolver pos x) [x] pos xs

mins _ mxs _ [] = mxs
mins minDist mxs pos (x:xs)
    | dist < minDist  = mins dist [x] pos xs
    | dist == minDist = mins dist (x:mxs) pos xs
    | otherwise       = mins minDist mxs pos xs
  where dist = distSolver pos x
于 2013-03-24T10:42:33.457 に答える