>ΣnCk (k=0,1,,,n) = 2^n >Σ(nCk)^2 (同上) = 2nCn >であるが >Σ(nCk)^3 (同上) = ???>3乗の計算に関して何か知っている人がいれば教えてください。
def zerol() return Set.new() end def succ(s) return s | Set.new([s]) end def number(n) s = zerol() for i in 1..n s = succ(s) end return s endsucc の性質から明らかに s ⊂ succ(s) とならなければならないはずですが、superset?, subset? を使うとこれが正しく判定されないようです。
irb(main):043:0> Set.new().hash() => 681390 irb(main):044:0> Set.new().hash() => 670910 irb(main):045:0> Set.new().eql?(Set.new()) => falseのように,同値性を判断できなくなっているのです.
配列などの場合は,要素のハッシュ値を元に配列全体のハッシュ値を計算するようになっているので,
[1,2,3]==[1,2,3]なども判定できるのですが,次の例のように自分自身を要素を含むような配列を作ると,途端にハッシュ値を計算できなくなります.
irb(main):046:0> a=[1,2,3] => [1, 2, 3] irb(main):047:0> a[1]=a => [1, [...], 3] irb(main):048:0> a.hash() SystemStackError: stack level too deep from (irb):48:in `hash' from (irb):48 from :0Setクラスのhash関数を定義し直せば,問題の例は扱えるようにはなると思いますが,「自分自身を要素に含む集合」を定義すると 同様の問題が生じる可能性はあります.
def prime(n) sod(n,n-1)==1 end
def prime(n) if sod(n,n-1)==1 true else false end endここで,以下のようにtrueやfalseを"true"や"false"と書くと真偽値ではなく文字列を返すということになり,
def prime(n) if sod(n,n-1)==1 "true" else "false" end end
x=4 if prime(x) x=x*2 else x=x-1 end xとなってしまう.
def prime(n) sod(n,n)==n+1 endとすると,prime(1)がfalseになるが,元々の練習問題ではn=1という入力が来る ことは想定していないのでここまで気を使う必要はない.
def combination(n,k) if k>n 0 else if k==0 1 else combination(n-1,k-1)+combination(n-1,k) end end end
def factorial(n) if n<2 1 else n*factorial(n-1) end end def combination(n,k) factorial(n)/(factorial(k)*factorial(n-k)) end
ruby vote.rb 選択肢番号のように使う.