3

{2n + 3m + 1 | n、m∈N}をリスト内包表記で表現するにはどうすればよいですか?Nは、0を含む自然数のセットです。

4

6 に答える 6

12

まもなく:

1:[3..]
于 2009-04-17T09:14:45.573 に答える
8

{2n+3m+1|n,m ∈ ℕ} = ℕ - {0,2} ではありませんか?

于 2009-04-17T08:44:30.327 に答える
7

次の Haskell 関数は、一方または両方が無限であっても、2 つのリストからすべてのペアを取得します。各ペアは 1 回だけ表示されます。

allPairs :: [a] -> [b] -> [(a, b)]
allPairs _ [] = []
allPairs [] _ = []
allPairs (a:as) (b:bs) = 
   (a, b) : ([(a, b) | b <- bs] `merge` 
             [(a, b) | a <- as] `merge` 
             allPairs as bs)
  where merge (x:xs) l = x : merge l xs
        merge []     l = l

次に、リストを次のように書くことができます

[2 * n + 3 * m + 1 | (n,m) <- allPairs [0..] [0..] ]

それがどのように機能するかを理解するために、無限の 1/4 平面を描き、次の結果を見てください。

take 100 $ allPairs [0..] [0..]
于 2009-04-18T03:09:28.687 に答える
4

[2*n + 3*m +1 | m <- [0..], n <- [0..]]で始まり、すべての n を通過し、次にすべての n を通過するため、機能しませんm = 0nただしm = 1、そのm = 0部分だけが無限であるため、m = 1 または 2 または 3 などに到達することはありません。[2*n + 3*m +1 | m <- [0..], n <- [0..]]とまったく同じ[2*n + 3*0 +1 | n <- [0..]]です。

それらすべてを生成するには、ユーザー vartec と Hynek -Pichi- Vychodil のように、必要な数のセットが自然数 - {0,2} であることを認識する必要があります。または、m、n が非負になるように、何らかの方法ですべてのペア (m、n) を列挙する必要があります。m + nそれを行う 1 つの方法は、同じ「対角線」のそれぞれに沿って進むことです。したがって、 の数字から始め、m + n = 0次にの数字から始めますm + n = 1。これらの各対角線には有限数のペアがあるため、常に次のペアに進み、すべてのペア (m,n) は最終的に次のようになります。数えた。

と を入れるi = m + nj = m、次のように[(m, n) | m <- [0..], n <- [0..]]なります。[(j, i - j) | i <- [0..], j <- [0..i]]

だからあなたのために、あなたはただすることができます

[2*(i-j) + 3*j +1 | i <- [0..], j <- [0..i]]

(もちろん、式で同じ数を生成する (m,n) ペアが複数あるため、このメソッドでも重複が生成されます。)

于 2009-04-17T17:38:20.417 に答える
0

私の0.2:

trans = concat [ f n | n <- [1..]]
 where 
  mklst x = (\(a,b) -> a++b).unzip.(take x).repeat
  f n | n `mod` 2 == 0 = r:(mklst n (u,l))
      | otherwise      = u:(mklst n (r,d))
  u = \(a,b)->(a,b+1)
  d = \(a,b)->(a,b-1)
  l = \(a,b)->(a-1,b)
  r = \(a,b)->(a+1,b)

mkpairs acc (f:fs) = acc':mkpairs acc' fs
                  where acc' = f acc
allpairs = (0,0):mkpairs (0,0) trans          
result = [2*n + 3*m + 1 | (n,m) <- allpairs]
于 2009-12-24T23:37:12.310 に答える
0

整数のすべてのペアを列挙してみることができます。このコードは、カリフォルニア大学バークレー校で説明されている列挙に基づいています (0 は含まれません)。

data Pair=Pair Int Int deriving Show

instance Enum Pair where
    toEnum n=let l k=truncate (1/2 + sqrt(2.0*fromIntegral k-1))
                 m k=k-(l k-1)*(l k) `div` 2
             in 
               Pair (m n) (1+(l n)-(m n))
    fromEnum (Pair x y)=x+((x+y-1)*(x+y-2)) `div` 2

ただし、別の列挙を使用できます。

次に、次のことができます。

[2*n+3*m+1|Pair n m<-map toEnum [1..]]
于 2009-04-19T20:41:24.547 に答える