bitterharvest’s diary

A Bitter Harvestは小説の題名。作者は豪州のPeter Yeldham。苦闘の末に勝ちえた偏見からの解放は命との引換になったという悲しい物語

Haskell ドリル3 数列

1.概略

数列はいろいろな場面ででてくる。自然数の数列、偶数の数列、3の倍数の数列などその時々の用途に応じて必要になる。Haskellでは数列は簡単に扱える。例えば、1から10までの数列であれば、[1..10]とすればよい。一般に、開始の整数をaとし、終了の整数をbとすると、a <= b の時に限り、aに始まりbで終了する数列は [a..b] と表すことができる。a > b のときは、bに始まりaで終了する数列 [b..a] を求め、それを reverseで反転させるとよい。

等差数列は、最初の数と2番目の数を与えればよい。例えば、始まりの数が1で、等差が2である数列は、最初の数が1で2番目の数が3なので、 [1,3..]とすればよい。但し、[1,3..]は無限数列なので、これを表示すると止まらない。take nという関数を用いると、最初のn個を取り出すことができるので、例えば、最初の10個を取り出したければ、take 10 [1,3..]とする。

等差数列は数列が降順であるものも許される。例えば、100で始まり等差が-2である数列は、[100,98..]と書くことができる。この数列も無限数列であるので、数列の最初の一部を表示したければtakeを用いる。

等差数列は、終了する数も指定することができる。例えば、2で終了したいときは[50,48..2]。

等差数列は、整数だけでなく、小数も許される。例えば、0で始まり、0.1刻みの数列は、[0,0.1..]となる。但し、小数の時は終了する数を示したとしても、丸め誤差による影響で数列が期待した値を取らない場合があるので、注意する必要がある。

2.例題

問題:100までの自然数naturalNumberを求める。自然数は0から始まるとみなす場合と、1から始まるとみなす場合の二通りがあるが、ここでは1から始まるものとすると、naturalNumber =[1..100 ] となる。実行結果は下図のとおりである。
f:id:bitterharvest:20141209134150p:plain

3.問題

それでは、問題を解いてみよう。なお、小数の場合はものすごく小さな数のところで差が生じる。これは、コンピュータが無限に小さな数を表すことができず、ある小さな桁のところで丸めることにより誤差が生じるためである。

問題1:2で始まる偶数の数列evenを求めなさい。また、始めの10個を表示しなさい。

問題2:1で始まる奇数の数列oddを求めなさい。また、始めの10個を表示しなさい。

問題3:3で始まる3の倍数の数列multiples3を求めなさい。また、始めの10個を表示しなさい。

問題4:5で始まる5の倍数の数列multiples5を求めなさい。また、始めの10個を表示しなさい。

問題5:10から20までの整数を降順(大きい数が先)に表示しなさい。

問題6:7で始まる等差が9の数列seriesを求めなさい。また、始めの10個を表示しなさい。

問題7:20で始まる等差が-3の数列series1を求めなさい。また、始めの10個を表示しなさい。

問題8:2.5で始まる等差が-0.5の数列series2を求めなさい。また、始めの10個を表示しなさい。

問題9:12.3で始まる等差が0.3の数列series3を求めなさい。また、始めの10個を表示しなさい。

問題10:問題9で得た数列の5番目から15番目までを表示しなさい。