パスカルの三角形を作ってみた
こういうの
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1
簡単に思いつく方法(再帰)
def combination n,k case k when 1 : 1 when n : 1 else combination(n-1, k-1) + combination(n-1, k) end end def pascal depth 1.upto(depth) do |n| 1.upto(n) do |k| print combination(n,k) end puts #改行 end end
でも、これだと遅い。(20段ぐらいが限界)
ほかに考えた方法。*1
def pascal2 depth =begin 1..depth => 0..(depth-1) 既に最初の段が入力されているため、さらに -1 なので、(0.. depth-2)でpascalと同じ段 =end (0 .. depth-2).inject([[0,1,0]]) do |re, i| re << [0,(2..re[i].size).map {|e| re[i][e-2]+re[i][e-1]},0].flatten end.each do |e| e.delete 0 print "#{e}\n" end end # pascal 5
比較した結果(depth=20で)
user system total real 最初の 4.125000 0.000000 4.125000 ( 4.235000) 次の 0.015000 0.000000 0.015000 ( 0.015000)
速度違いすぎww
後で、グラフにしてみようかなー
*1:直接9段分を配列に格納するだけなら、「(0.. 9-2).inject([ [0,1,0] ]) {|re,i| re << [0,(2..re[i].size).map {|e| re[i][e-2]+re[i][e-1]},0].flatten }}.each {|e| e.delete 0}」でできる。