0

そのような番号から始めて、(は番号です)の500番号を含む番号のリストを生成する必要があります。プログラムの終了方法がわからないので、誰か助けていただければ幸いです。プログラムは引数を取ることができません。たとえば、許可されていません。div 23 x == 7x51required xs

required
   = do
      putStr "Required list is: "
      print [c x m n | c <- what goes here?, x <- [1 ..], div 23 x == 7, n <= 500 && m >= 51]
4

3 に答える 3

3

あなたはこれを使うことができます:

let theList = take 500 [x | x <- [51..], div 23 x == 7]
print theList

これは非常に単純な問題のようですので、あなたの説明を正しく理解していない可能性があります。

また、その数は1つだけですdiv 23 x == 7。つまり、3です(23 / 3 ~= 7整数演算であるため)。したがって、リストには500個の要素が含まれず、プログラムはリストの要素を検索しようとしてフリーズします。

(質問者はおそらく彼が説明しなかった別の問題を抱えているので、私は問題の完全な解決策を提供しています。)

于 2012-05-20T18:29:20.953 に答える
1

take 500 (drop 50 [x | x <- [1..], div 23 x == 7]):最初に必要な番号のリストを生成し、最初の50を削除して(最終的に51番目の番号になるように)、次に500を取得します。

mod x 23 == 7dflemstrが言ったように、div 23 x == 7のような数は1つしかないので、代わりに、つまり23で割ったときに7を残す数を意味すると思います。その特定の場合、より良い解決策はmap (\x -> 23 * x + 7) [50 .. 549]エラーです-傾向がある; 私は最初の試みでエラーを犯しました!

于 2012-05-20T19:07:08.770 に答える
0

リスト内包表記を使用してリストを生成する場合、通常、この場合(私を含む)、dflemstrの回答が優先されます。あなたはHaskellを初めて使用するので、リストを取得する方法を詳細に説明したいと思います。結果は同じになるはずです。

注:私のコードはghciプロンプトに入れることができません。hsファイルを作成し、ghciから:lを使用してコンパイルまたはロードする必要があります。

-- raw is [51, 52, 53, ... to infinity]
lst_raw = [51..]

-- you want only element that make this predicate True so just filter that do not out
lst_flt = filter (\x -> div 23 x == 7) raw

-- above list is infinite, want only first 500 element
mylist = take 500 lst_flt

または、複数の行を組み合わせて、使用しない中間バインディングを取り除くことができます

mylist = take 500 $ filter (\x -> div 23 x == 7) [51..]

また、 div23xとdivx23は異なり、 div 23 xは値を取得しないように見えるため、 div23xの部分に興味があります==7

> take 100 $ map (\x -> x `div` 23) [1..]
[0,0,0,0,0 ... 4,4,4,4]

> take 100 $ map (\x -> 23 `div` x) [1..]
[23,11,7,5,4,3,3 .... 0,0,0,0]
于 2013-01-30T11:33:39.660 に答える