2016-08-08 9 views
0

私は、2D配列としてパスカルの三角形を生成する方法を書こうとしています。例:ここではRubyのPascal Triangle

pascal(3) # => [[1],[1,1],[1,2,1]] 

は私のコードです:

def pascal n 
    pascal = [] 
    row = [1] 
    (1...n).each do |i| 
    #first iteration set pascal equal to [[1]] and row to [1,1] 
    if i.zero? 
     pascal << row 
     #sets new value for row for next iteration 
     row = [1,1] 
    else 
     #row generator sets new value for row 
     row = ([0] + row).zip(row + [0]).collect { |a, b| a + b } 
     #push row's new value into pascal array 
     pascal << row 
    end 
    end 
end 

私は、行の発電機が正常に動作します知っている、私はIRBで自分自身をテストしてみました。あたかも実行されなかったかのように、出力は1...5です。

私のコードに何が悪いと思いますか?私が初心者だとわかるように、穏やかにしてください。ありがとうアドバンス:)

答えて

0

ルビメソッドの戻り値は評価された最後のものです。あなたの場合、それはeachです。 eachは反復したもの(範囲)を返します。明示的にpascal配列をメソッドから返す必要があります。これが必要な結果であると思われます。メソッドの最後にこの行を追加します。

 pascal << row 
    end # end if 
    end # end each 

    pascal # < this line 

end # end method 

これは、それゆえ、メソッドの戻り値をpascal評価した最後のものを作るとします。

JFYI、あなたのコードはロジックを壊しているようです。上記の補正を行うと、これが得られます(これはあなたの期待と一致しません)。

pascal(3) # => [[1, 1], [1, 2, 1]] 

これをデバッグするには任せます。 :)

+0

私はそれがうまくいかなかった理由を知りました。私は反復にも集中していました。返すことを忘れました。 すぐにデバッグを開始します! – cerealCode

+1

これは、最後の質問とまったく同じバグです。慣習的には、 'each'の代わりに' map'を使います。もしそうすれば、あなたのコードはそれだけでうまくいくでしょう。 –

+0

知っておいて、私はそれぞれの違いを忘れてしまいがちです。範囲を '(1 ... n + 1) 'に変更して解決しましたが、代わりにmapを使用します – cerealCode