11/17 関数から「計算」へ(2)


前回までの補足


前回の感想,質問より

Q.
授業の途中で、プログラムをコピペする時に、ファイル名が表示されるエラーが起きた。まだ使いこなせていない感がある。
A.
前回も書きましたが,irb(isrb)にコピー&ペーストするときに,字下げのためのtabが入っているとうまくいかないようですね.ファイルを保存してから,
load("./ファイル名")
で読み込む場合は大丈夫のようです.
Q.
「*」を「**」にしてたせいで時間が。。。
A.
文法エラーになるような書き間違いなら良いのですが,答えが出て間違って いるとなかなか分かりませんね.テキストエディタのフォントを大きくすると間違いに気づきやすくなるかもしれません.
Q.
すごく今更ですけどmiで改行コードが『LF』じゃないとターミナルでload("./")が上手くいかないのはどうしてですか? ターミナルってUNIXなんですか?
A.
テキストファイルの改行コードとして何を使うかはいくつかの流儀があります.
CR LF
DOS, Windowsなど
LF
Unix系OS
CR
旧MacOS(MacOS 9.X以前)
現在の MacOSはUnix系OSなので改行をLFとして扱うアプリケーションが多いのですが,旧MacOSとの互換性を重視して標準改行コードをCRで扱うテキストエディタも多く使われていて,miもその一つです.

前回の課題について

Q:
素数とは、1 と自分自身しか約数がないような数である。上で定義した関数 sod を使って 2 以上の整数 n が素数のときにのみ true, そうでないときに false となるような関数 prime(n) を定義せよ。(n が 1 の 場合は考えなくてよい。つまり、prime(1) の答は true でも false でもよい とする。)
解答例
素数は「1と自分自身しか約数がない数」なので,n>=2の時「n-1以下のnの約 数が1だけしかない数」と等しい.「n-1以下のnの約数が1だけしかない」ならば 「n-1以下のnの約数の和」は1であり,かつその時に限るので,以下のように書け る.
load("./sod.rb")
def prime(n)
  sod(n,n-1)==1
end
実行してみると
irb(main):009:0> prime(1)
=> true
irb(main):010:0> prime(2)
=> true
irb(main):011:0> prime(3)
=> true
irb(main):012:0> prime(4)
=> false
irb(main):013:0> prime(5)
=> true
irb(main):014:0> prime(6)
=> false
irb(main):015:0> prime(7)
=> true
irb(main):016:0> prime(8)
=> false
irb(main):017:0> prime(9)
=> false
irb(main):018:0> prime(10)
=> false
となり,2以上の整数に関しては正しい値を返します.1でfalseとしたければ,
load("./sod.rb")
def prime(n)
  sod(n,n-1)==1 && n>=2
end
などとすれば良いです.
def prime(n)
  sod(n,n)==n+1
end
としていた回答もあり,これも正しい答えです.
Q.
n個からk個を選ぶ組み合わせ数 nCkを求める combination(n,k)を定義せよ(教科書P. 58練習4.2)
A.
教科書P.58の定義に従って定義します.
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
なお,組み合わせ数nCk自体はnの階乗(n!)を求める関数 factorial(n) を
def factorial(n)
  if n==1
    1
  else
    n*factorial(n-1)
  end
end
と定義した上で,関数 combination(n,k) を
def combination(n,k)
  factorial(n)/factorial(k)/factorial(n-k)
end
と定義することも可能ですが,教科書P.63の練習4.4を解く際は教科書P.58の定義に従って 記述した関数 combination を使ってください.

投票システム

vote.rbをダウンロードして,ホームディレクトリに保存してください.ドックからターミナルを起動して,
ruby vote.rb 選択肢番号
のように使います.

今日の練習,投票

関連リンク


教科書の補足


今日の課題