Ruby
数列

【Ruby】等差数列・等比数列を作成する1番シンプルな処理


はじめに

数学ってすごい。


等差数列

(2019/4/15 19:45追記)

@scivola様からコメントでいただいたソースを追加しました


arithmetic_sequence.rb


# num: 初項
# diff: 公差
# length: 数列の長さ
def arithmetic_sequence(num, diff, length)
Array.new(length) { |n| num + diff * n }
end

p arithmetic_sequence(0, 5, 5)
# => [0, 5, 10, 15, 20]


# scivola様のコメントより

num = 7 # 初項
diff = 2 # 公差
length = 3 # 数列の長さ

num.step(by: diff).take(length)
# => [7, 9, 11]


等比数列


geometric_sequence.rb

# num: 初項

# ratio: 公比
# length: 数列の長さ
def geometric_sequence(num, ratio, length)
Array.new(length) { |n| num * ratio**n }
end

p geometric_sequence(3, 3, 5)
# => [3, 9, 27, 81, 243]



おまけ - フィボナッチ数列

フィボナッチ数列の一般項の公式は平方根とか絡んできて複雑になるんで、素直に繰り返し処理に甘んじました。

もっといい書き方があったら教えてください。

(2019/4/15 19:45追記)

@scivola様からコメントでいただいたソースを追加しました

@QUANON様からコメントでいただいたソースを追加しました

# num: 初項

# length: 数列の長さ
def fibonacci_sequence(num, length)
sequence = [num, num]
2.upto(length - 1) { |n| sequence[n] = sequence[n - 2] + sequence[n - 1] }
sequence
end

p fibonacci_sequence(1, 10)
# => [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

# scivola様のコメントより

def fibonacci(n)
result = [1, 1]
(n - 2).times{ result << result[-2, 2].sum }
result[0, n]
end

# QUANON様のコメントより

def fibonacci_sequence
Enumerator.new do |y|
a = b = 1
loop do
y << a
a, b = b, a + b
end
end
end

fibonacci_sequence.take(10)
#=> [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]


まとめ

解説は省きます。

意味がわからない人は「等比数列 一般項」とかでググってください。

Rubyは多少複雑な処理も工夫次第で驚くほど少ないコード量で書くことができるから本当に楽しいですね。