学習の中で等差数列という問題が出たので、内容を備忘録としてまとめました。
等差数列とは?
等差数列とは「はじめの数に、一定の数を足し続ける数列」
というものになります。
たとえを元にすると、
2, 5, 8, 11, 14, 17, 20…
この数列は、はじめの数(2)に、一定の数(3)を足し続けていますね。
こういったものが等差数列です。
「はじめの数に、一定の数をかけ続ける数列」という「等比数列」というのもあるのですが、
まずは等差数列をRubyで表現したいと思います。
等差数列
-
例題
初期値 m ,公差 n の等差数列を1〜10番目までスペース区切りで出力して下さい。 -
入力例
3 5 -
出力例
3 8 13 18 23 28 33 38 43 48
解答
a, b = gets.split(" ").map(&:to_i)
array = []
10.times {|i|
array[i] = a + b * i
}
puts array.join(" ")
解説
a, b = gets.split(" ").map(&:to_i)
ここで入力された値をsplitメソッドとmapメソッドを使い、
入力された数値3, 5
をそれぞれ、aとb変数の中に格納しております。
a => 3
b => 5
array = []
10.times {|i|
array[i] = a + b * i
}
空のarray変数を用意して、timesメソッドを使って0〜9までの10個の数値をそれぞれ繰り返しで格納していきます。
array[i] = a + b * i
掛け算は足し算よりも先に計算をされるためb * i
が先に計算され、aを加えてarray変数にそれぞれ格納されていく…という形になります。
array => [3,8,13,18,23,28,33,38,43,48]
puts array.join(" ")
joinメソッドで空白を入れつつ配列を繋げて出力すれば出力例の通りになります。
等比数列
続いて「等比数列」を説明します。
等比数列というのは
「はじめの数に、一定の数を掛け続ける数列」
というものになります。
例としてはこんな感じです。
2, 4, 8, 16, 32, 64, 128…
この数列は、はじめの数(2)に、一定の数(2)をかけ続けている…というのがわかるかと思います。
- 例題
初期値 m ,公差 n の等比数列を1〜10番目までスペース区切りで出力して下さい。 - 入力例
3 2 - 出力例
3 6 12 24 48 96 192 384 768 1536
解答
a, b = gets.split(" ").map(&:to_i)
array = []
10.times {|i|
array[i] = a
a *= b
}
puts array.join(" ")
解説
a, b = gets.split(" ").map(&:to_i)
ここは等差数列と同じです
array = []
10.times {|i|
array[i] = a
a *= b
}
等差数列と同じく、空のarray変数を用意して、timesメソッドを使い0〜9までの10個の数値をそれぞれ繰り返しで格納していきます。
ただし、数値の計算として初期値が3で回数を重ねていくごとに2を掛け算していくため
array[i] = a
a = a * b => a *= b
という式で掛け算した値がaに代入され、array変数にそれぞれ格納されていく…という形になります。
array => [3,6,12,24,48,96,192,384,768,1536]
puts array.join(" ")
あとはjoinメソッドで空白を入れつつ配列を繋げて出力をすれば出力例の通りになります。
まとめ
もっとスマートにする方法はあるかと思いますが、基本的な考え方を元に説明してみました。
例題に関しては実際にあった問題を元に作成している為、細かな記載ミスがあるかもしれません。
もし見つけた際はお手数ですが、ご指摘いただければ幸いです。