2009-04-17 11 views
3

{2n + 3m + 1 | n、m∈N}をリスト内包式で表現するにはどうすればよいですか? Nは0を含む自然数の集合です。リストの理解形式で{2n + 3m + 1 | n、m∈N}を表現する方法は? (Nは0を含む自然数の集合)

+1

これは宿題の質問のように見えるが、そのようなとしてタグ付けされていません。対応するFAQをお読みください:http://stackoverflow.com/questions/230510/homework-on-stackoverflow – nominolo

+1

これは具体的なものではありません。回答にセマンティクス(重複しない)を設定しますか?秩序は問題ですか? –

答えて

7

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

+1

いいえ、2は設定された理解にありません。 – nominolo

+0

と2。2 * n + 3 * mから1を得ることはできません – FryGuy

+3

ええ、そうです。しかし、これらの2つを除いて、任意のx> 2∈Nは、2n + 3m + 1として表すことができる。 – vartec

10

:それはm = 0で始まり、すべてのnを通過した後、m = 1を持っており、すべてのnを通過する、などしかし、単にm = 0一部が無限であるので

1:[3..] 
+0

リストの理解を使用するように求められた。 – Romildo

4

[2*n + 3*m +1 | m <- [0..], n <- [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)を列挙する必要があります。これを行うための1つの方法は、「対角線」のそれぞれに沿って行くことです。ここで、m + nは同じです。だから、m + n = 0の数字から始まり、m + n = 1などの対角線の数字が始まります。これらの対角線のそれぞれは有限数のペアを持っていますので、常に次のものに進み、すべてのペア(m、n)は最終的には数えられる。私たちはi = m + nj = mせた場合

は、その後、[(m, n) | m <- [0..], n <- [0..]]はあなただけで複数存在するため、この方法はまた、(あなたのための複製を生成しますもちろん(

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

行うことができ、あなたのため[(j, i - j) | i <- [0..], j <- [0..i]]

そうなりましたあなたの式で同じ数を生成するm、n)のペア)。

+0

私はその答えを投稿したとき何を飲んでいたのですか:P 私は無駄な投稿を削除します:) – Sujoy

+0

重複を排除するためにリストをいつもnubすることができますが、厳密にはリストではありませんそれは過度の量のメモリを使用します。 – ephemient

6

次のHaskell関数は、一方または両方が無限であっても、2つのリストのすべてのペアを提供します。各ペアは、一度だけ表示されます:

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 

あなたは、その後、それがどのように動作するかの感触を得る無限1/4平面を描き、そして

の結果を見るために

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

としてあなたのリストを書くことができ

take 100 $ allPairs [0..] [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 

(0は含まれません)University of California Berkeleyで説明列挙に基づいています。しかし、あなたは別の列挙を使用することができます。

次に、あなたが行うことができます:

[2*n+3*m+1|Pair n m<-map toEnum [1..]] 
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] 
関連する問題