12/4 数値計算(1)


前回の感想,質問より

Q.
最初ia = ia + 1の部分をia++のようにインクリメント演算子を使ったら、エラーが起きて実行できませんでし た。 よくわからないですけど、ia = ia + 1のように書き直したら動いたのでよかったです。
A.
多くのプログラミング言語で,変数iaを1増やすのに
 ia = ia + 1
と書く代わりに
 ia++
とか
 ++ia
と書くことができます.しかし,Ruby言語ではインクリメント(デクリメント)演算子を採用していません.これは, Ruby言語の設計者のまつもとゆきひろさんのポリシーによるものだと思います.
 ia++
と書くと文法エラーになりますし(irbでは,次の行の入力待ち状態になります),
 ++ia
と書くと,
 +(+(ia))
と解釈されて,単にiaと書いたのと同じ意味になります.なお,
 ia = ia +1
の代わりに
 ia += 1
と書くことはできるので,少しでも短く書きたい場合はこのように書くのが良いでしょう.
Q.
>エラーが何を言っているのかがわからないので、その解読の仕方も教えていただけるとうれしいです。
 irb(main):001:0> load("./merge.rb")
 SyntaxError: ./merge.rb:22: syntax error, unexpected kELSE, expecting kEND
 ./merge.rb:26: syntax error, unexpected $end, expecting kEND
 from (irb):1:in `load'
 from (irb):1
A.
それでは説明します. プログラムを見ると,
 if ia==a.length()
   for k in ib..(b.length()-1)
    c[a.length()+k]=b[k]
  else
の「else」の行が22行目にあたると思いますが,たしかに,20行目から始まるforをendで閉じた後に「else」を書く必要があります.同様のendの書き忘れがあるので,それを直せばこのエラーは出なくなるはずです.

なお,2つめ以降のエラー,

  ./merge.rb:26: syntax error, unexpected $end, expecting kEND
は,さきほどとほぼ同じですが「merge.rbの26行目でruby処理系が 'end' というキーワード(keyword)が来るのを期待したら,ファイルの最後(end of file)になったのでびっくりした」という意味です.
Q.
プログラムとは全く関係ない話になりますが、授業中に行列の固有値は高校でもやりますよね、というようなこ とをおっしゃっていましたが、高校の教科書には載っていませんでした。2x2行列の固有値くらいなら受験の時に 勉強しましたけど。
A.
ご指摘ありがとうございます.高校の課程で行列を扱っているのは確認したのですが,固有値は扱っていな いのですね.この部分のスライドは来年度からは修正します.2015年度からは行列そのものを扱わなくなる ようですね.
Q.
全く関係ないですが、
include Math
def f(k)
  a=(1+5**0.5)/2.0
  b=(1-5**0.5)/2.0
  (a**(k*1.0)-b**(k*1.0))/(a-b)
end
で、フィボナッチ数列が求まりますね?表示が整数になりませんけど。
A.
はい.これは,行列による定義から導出可能ですね. プログラミングの練習問題では数学で考えるとより簡単に求まるものを,わざわざ繰り返し計算で求めることもよくあります.「1からnまでの数の和を求める」などもこの類ですね.

前回の課題について


第1-4章まとめ課題投票


投票システム

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

今日の練習,投票

関連リンク


今日の課題