3

これを行うためにリスト内包表記を使用する方法は知っていますが、与えられた 2 つのセットのデカルト積を再帰的に計算する関数を実装するにはどうすればよいでしょうか?

ここで私は立ち往生しています(そして私は初心者です)

crossProd :: [Int] -> [Int] -> [(Int,Int)]
crossProd xs ys | xs == [] || ys == [] = []
                | otherwise = (head xs, head ys) : crossProd (tail xs) (ys)

これの出力は私に与えます

[(1,4),(1,5),(1,6)]

セットがそれぞれ[1,2,3]と である場合[4,5,6].. 残りを取得するにはどうすればよいですか?

4

2 に答える 2

4

最も基本的なケースは次のとおりです。

{-crossProdAux :: Int -> [Int] -> [(Int,Int)]-}
crossProdAux x []    = []
crossProdAux x (a:b) = (x, a):(crossProdAux x b)

{-crossProd :: [Int] -> [Int] -> [(Int,Int)]-}
crossProd [] ys   = []
crossProd (a:b) ys= (crossProdAux a ys)++(crossProd b ys)
于 2013-02-15T04:30:16.633 に答える
3

これは、単一の関数で実行できます。

crossProd :: [a] -> [b] -> [(a, b)]
crossProd (x:xs) ys = map (\y -> (x, y)) ys ++ crossProd xs ys
crossProd _      _  = []

これが sだけでなく、任意のaandに対して機能するように、型を一般化したことに注意してください。bInt

この機能の鍵は、最初のリストの各要素を 2 番目のリストの各要素とペアにすることを理解することです。したがって、このソリューションxは最初のリストから 1 つの要素を取得し、それを のすべての要素とペアにしysます。yこれは、から各値を取得しys、ペアに変換する関数をマッピングすることによって行われます(x, y)。これをリストの残りの部分と一緒に再帰の先頭に追加しますxs

基本ケースでは、ペアにするものが残っていないため、出力は空です。

于 2013-02-15T11:06:42.040 に答える