内容は凄くシンプル。
def sigma(Integer from, Integer to, Closure clj = null){
(from..to).inject(0){a,b -> a + (clj? clj(b):b)}
}
// http://www24.atpages.jp/venvenkazuya/mathB/progression9.php
// 上記ページの「それではこの調子でいくつか解いてみましょう。」以降の問題を解いてみる。
// ak, k=2から6まで
assert 20 == sigma(2,6)
// ak=2k-1, k=1から5まで
assert 25 == sigma(1,5){ k -> (2 * k) - 1 }
// ak=3*2^(k-1), k=1から6まで
assert 189 == sigma(1,6){ k -> 3 * (Math.pow(2,k-1)) }
// ak=2k^2, k=3から5まで
assert 100 == sigma(3,5){ k -> 2 * (Math.pow(k,2)) }
シグマ云々よりも、実は今話題の以下のような記事に触発されて。
http://jp.techcrunch.com/2013/12/16/20131214code-literacy/
例えば今回のようにシグマという記号がある場合、どうやって計算したら良いのかを丸暗記してテスト(学校の)で何度も何度も手で計算するより、一回今回のようにコードを書いておけば、「なんでその答えになるの?」という疑問は自分で書いたコードを読み返せば一目瞭然。
自分の記憶をたどると、問題を解いてもその答えあわせが非常に面倒くさかった記憶がある。
この問題もコードを書いておけば解決する。
自分の考えていた解答が間違っているのでれば、値を変えて再実行すればまた一瞬で答えあわせが出来る。
このスピーディーな流れは勉強に非常に重要だと思う。
もう一度面倒くさい計算を手作業でやりなしてもまた間違えるかも・・・というネガティブな気持ちが起き辛くなるし、そうすることでエジソンの言っていた「失敗したんじゃない。この方法では上手くいかないという発見をしたのだ。」をリアルに体感できるはず。
さらに、これは直接は関係ないけど、「学校で勉強する事とか大人になってから使わないし!」って言うのは誰もが一度は感じたことだと思う。自分もそうだった。
でも、「使わない」んじゃなくて、「使えない」んだよね。知らないと。
さらに言うと「何に使えるんだろう?」を考えたり、全く関係なさそうな問題を解決するときにそういった知識が利用できるという事を発見するというのが凄く楽しい。プログラミングはお金だけじゃなくて、そういったプライスレスなとっても大切なことを自分に教えてくれたと思う。
だから、別に難しいことを考えずに、みんな楽しみながらプログラミングを学べば良いんじゃないだろうか。
ブログでやれっていう内容だけどQiitaがあまりにも使いやすいので・・・