tôi có một giải pháp python3 (đọc SICP chương 3,5)
class Stream:
def __init__(self, head, tail):
self.head = head
self.tail = tail
self.memory = None
self.isDone = False
def car(self):
return self.head
def cdr(self):
if self.isDone:
return self.memory
self.memory = self.tail()
self.isDone = True
return self.memory
def __getitem__(self, pullFrom):
if pullFrom < 1 or self.memory == []:
return []
return [self.car()] + self.cdr()[pullFrom - 1]
def __repr__(self):
return "[" + repr(self.car()) + " x " + repr(self.tail) + "]"
def map(self, func):
if self.memory == []:
return []
return Stream(func(self.car()), lambda: Stream.map(self.cdr(), func))
def from_list(lst):
if lst == []:
return []
return Stream(lst[0], lambda:
Stream.from_list(lst[1:]))
def filter(self, pred):
if self.memory == []:
return []
elif pred(self.car()):
return Stream(self.car(), lambda: Stream.filter(self.cdr(), pred))
else:
return self.cdr().filter(pred)
def sieve(self):
return Stream(self.car(), lambda: self.cdr().filter(lambda n: n % self.car() > 0).sieve())
def foreach(self, action, pull = None):
if pull is None:
action(self.car())
self.cdr().foreach(action, pull)
elif pull <= 0:
return
else:
action(self.car())
self.cdr().foreach(action, pull-1)and run:
a = Stream(0, lambda: a.map((lambda x: x + 1)))
print(a[10])
trả về: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
.
Nhưng suối đang uể oải đánh giá, vì vậy:
>>> a = Stream(0, lambda: a.map((lambda x: x + 1)))
>>> print(a)
in:
[0 x [...]]
Nguồn
2017-03-23 12:38:49
có một cái nhìn tại scipy hoặc gấu trúc –
Tại sao không chỉ 'itertools.count'? OP muốn một số học tiến triển. –
Để lưu trữ danh sách vô hạn, bạn cần một ổ cứng thực sự lớn. –