プログラムの骨組み(の主なパターン)

1 イベント駆動

3. 繰り返しのための道具: メソッドと内包表記

(1..10).each{|i|puts i}
(1..10).map{|i|i**2}      # 2乗の数列
# rubyには内包表記はない
# python では each系のメソッドはなく、繰り返し動作は for を使う
list(map(lambda i:i**2, range(1,11)))
[i**2 for i in range(1,11)]
map (^2) [1..10]
[i^2|i<-[1..10]]
[...Array(10).keys()]     // => 0 ~ 9の配列
// 1 ~ 10 にするには以下のような方法がある
[...Array(10).keys()].map(i=>i+1)
[...Array(11).keys()].slice(1)  
// 
[...Array(11).keys()].slice(1).map(i=>i**2)  

4. 再帰

4.1 再帰の例(メソッドでも書けるケース)
4.2 末尾再帰

前の定義では、

そのため、子フレームが終了するまでその親フレームは処理の途中で待機しておく必要がある。

子フレームの値を(その後の演算をせずに)そのまま自フレームの値として返すようにプログラムすると、

前節のコードを末尾再帰に直すと以下のようになる。

function fact_t(n,r=1) { // 返すべき値の種 r の初期値は第2引数の省略値として渡す
    return n>1 ? fact_t(n-1,r*n) : r
} 
// または
function fact_t2(n) {       // 内部関数として末尾再帰関数を用意する
    function fact_t2_i(n,r) {
        return n>1 ? fact_t2_i(n-1,r*n) : r
    }
    return fact_t2_i(n,1)
} 
4.3 二進十進変換

'100101001' などの文字列(以下の説明では変数 s とする)が与えられたときに、 これを(2進数だと解釈して) Integer型の数値に変換することを考える。

4.3 再帰の例(メソッドでは書きにくいケース)

ということを考えてプログラムを作ってみましょう。 (サンプルへのリンクを前回資料末尾に置きました。)