2016-10-16 6 views
2

ただの簡単な質問です。おそらくここでは何かを見落としています。最初のn個の奇数を返すメソッド

以下の方法は、正しく最初の2つの奇数を出力:[1,3]

私は間違っていない場合、私は最終的に等しい nの配列の長さを望んでいない必要がありますか?私はそれを理解するように、出力アレイ[1,3]の長さは、第1のn多くのオッズ表す、2:このように2

を、ライン6での比較は、現在< =あろういうよりも<

しかし、私がしなければ私の最初のオッズを与える、first_n_oddsは(2)[1,3,5]今等しいだろう、という。何が起きてる?

ありがとうございます!

def first_n_odds(n) 

    array = [] 
    current_number = 0 

    while array.length < n 
     if current_number % 2 == 1 
     array << current_number 
     end 
     current_number += 1 
    end 

    return array 

end 

puts first_n_odds(2)  # output is [1,3] 
+0

最終的には配列の長さが 'n'ではないと思いますか? –

答えて

2

例をn == 2としましょう。

反復1:array.length == 0。 反復2:array.length == 1

これらの値はいずれも< 2です。今度は<<=に変更すると、チェックが行われてからarray.length == 2という3回目の繰り返しが発生します。の前に、の配列に新しい要素を追加します。

あなたはルビーにかなり新しいように見えるので、ここではより多くの慣用的な方法でメソッドを定義するには、いくつかの方法があります。

# Mapping over a range 
def first_n_odds_1(n) 
    (0...n).map { |x| x * 2 + 1 } 
end 

# Mapping over an Enumerator 
def first_n_odds_2(n) 
    n.times.map { |x| x * 2 + 1} 
end 

# Using Numeric#step + Enumerable#take 
def first_n_odds_3(n) 
    1.step(Float::INFINITY, 2).take(n) 
end 

# A more explicit version of the previous method 
def first_n_oods_4(n) 
    1.step(by: 2, to: Float::INFINITY).take(n) 
end 
+0

'(1..n).map {| x | x * 2 + 1} 'は「1」を失い、(n + 1)番目の奇数を含む。 –

+0

おっと、はい。あなたが見る通り、私は多くの異なったバージョンを持っていて、私はIRBから間違ったものをここにコピーしました。それをキャッチするためにありがとう。 –

+0

これは絶対に素晴らしいです。これで私を導いてくれてありがとう!私がRubyを学び始めてから約1ヶ月が経過しています。本当にありがとうございます。 – Andy

0

私はそれを行うだろうかだこと:

def first_n_odds(n) 
    (1..(2*n)).step(2).to_a 
end 

puts first_n_odds(10).inspect 

出力:

[1, 3, 5, 7, 9, 11, 13, 15, 17, 19] 
+0

'puts first_n_odds(10).inspect'の代わりに' p first_n_odds(10) 'を書くことができます。 –

関連する問題