python の range()

length が引数な Array を返してくれる関数。

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

javascript

特に何も考えないで書いたらこうなった。

var range = function(n){
	var ary = new Array(n);
	for(var i=0; i<n; i++){
		ary[i] = i;
	}
	return ary;
}

再帰してみる。

var rec_range = function(n, ary){
	if(n){
		if(!ary) ary = []
		ary[ary.length] = ary.length;
		return rec_range(n-1, ary);
	} else {
		return ary || [];
	}
}

javascript は引数足りんくても怒られないんで rec_range(10) でおk。最初再帰呼び出しするとこで rec_range(n--, ary) して永久ループなって n-- と n-1 の違いを知った(今更
MochiKit の range() はなんかおりじなるなオブジェクト返してきた。iterable ぽい。

lisp

(defun range (n)
  (if (< n 1)
	  ()
	(progn
	  (setq n (- n 1))
	  (append (range n) (list n)))))

難しいってゆーか、基本的な関数とか知らなすぎ。なんかいまいちな気がするが、どうなのかもさっぱりわからん。

python

range() 使わないで作ってみる。

def rrange(n, ary=0):
    if not ary: ary = []
    if n:
        ary.append(len(ary))
        return rrange(n-1, ary)
    else:
        return ary

range() なしでループする方法が思いつかずにいきなり再帰。 ary=0 って渡されなかったときに代入される訳ではないのを知った(今更
調べてみたらチュートリアルに書いてあった。雑魚すぎ。

書いてて while なんかあったのを思い出した。

def wrange(n):
    ary = []
    while n:
        n = n - 1
        ary.insert(0, n)
    return ary

感想

再帰はケツから考えると少し楽だ。