遅延リストでフィボナッチ数
30分プログラム、その504。今日、ミーティングで遅延リストの話をしたので、遅延リストを使ってフィボナッチ数を書いてみる。
最初、
improt itertools def ones(): return itertools.chain([1],ones())
とやったら、えらい目にあってしまった。
しょうがないので、俺chainを作って
def ones(): return chain(lambda: [1],lambda: ones())
と書けるようにした。
使い方
$ python fib.py 1 2 3 5 8 13 21 34 55 89 144 233
ソースコード
#! /usr/bin/python # -*- mode:python; coding:utf-8 -*- # # fib.py - # # Copyright(C) 2009 by mzp # Author: MIZUNO Hiroki / mzpppp at gmail dot com # http://howdyworld.org # # Timestamp: 2009/01/06 23:19:11 # # This program is free software; you can redistribute it and/or # modify it under MIT Lincence. # import itertools def chain(*iterables): for it in iterables: for element in it(): yield element def tail(it): it.next() return it def fibs(): return chain(lambda :[1,2],lambda : itertools.imap(lambda x,y: x + y,fibs(),tail(fibs()))) for (i,n) in itertools.izip(itertools.count(0),fibs()): print n if i > 10: break