遅延リストでフィボナッチ数

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