次の整数のモンキー パッチ メソッドから正しい結果が得られません。
def harm
1 + (2..self).inject{|sum, x| sum + 1/x.to_r}
end
2.harm #=> 3
代わりに 3/2 を返す必要があります。私の間違いはどこですか?
次の整数のモンキー パッチ メソッドから正しい結果が得られません。
def harm
1 + (2..self).inject{|sum, x| sum + 1/x.to_r}
end
2.harm #=> 3
代わりに 3/2 を返す必要があります。私の間違いはどこですか?
ここには 2 つの問題があります。
のような閉じた範囲を反復処理すると2..2
、実際には何も起こりません。
(0..0).inject(){|s, x| s+= 99 }
# => 0
3
これが、そのままを取得する理由1 + 2
です3
。
に引数を渡さない場合inject
、イテレータに最初に渡した値を開始メモとして使用します。つまり、次のようになります2
。
(2..2).inject(){|s, x| s+= 99 }
#=> 2
0 を入れると、実際の反復が得られます。
(2..2).inject(0){|s, x| s+= 99 }
#=> 99
だからあなたの方法で代わりにこれを試してください:
1 + (2..self).inject(0){|sum, x| sum + 1/x.to_r}
スタンドアロン:
1 + (2..2).inject(0){|sum, x| sum + 1/x.to_r}
#=> 3/2
ヒントは次のとおりです(メソッドに初期値を渡す必要がありますinject
):
def harm
1 + (2..2).inject(0){|sum, x| sum + 1/x.to_r}
end
harm # => (3/2)
のドキュメントEnumerable#inject
:
ブロックを指定すると、enum の各要素に対して、ブロックにアキュムレータ値 (メモ) と要素が渡されます。代わりにシンボルを指定すると、コレクション内の各要素が memo の名前付きメソッドに渡されます。どちらの場合も、結果が memo の新しい値になります。反復の最後に、 memo の最終値がメソッドの戻り値になります。
memo の初期値を明示的に指定しない場合、コレクションの最初の要素が memo の初期値として使用されます。