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
感想
再帰はケツから考えると少し楽だ。