Python,最简单:
def a(n):
if n == 0: return 1
return 1 - 1 / float(a(n-1) + 3)
# limit is sqrt(3) - 1
limit = 3.0 ** 0.5 - 1.0
# get 9 digits' precision
i = 0
while abs(a(i) - limit) > 1.0e-9:
i += 1
print i
这会发出8,表明可能不需要进行递归消除或记忆等优化。
当然,通常我们希望通过数值而不是分析获得极限,因此正常的循环方式会大不相同——最好封装在高阶函数中......:
# get a function's limit numerically
def limit(f, eps=1.0e-11):
previous_value = f(0)
next_value = f(1)
i = 2
while abs(next_value - previous_value) > eps:
previous_value = next_value
next_value = f(i)
i += 1
return next_value
非平凡的循环逻辑通常最好封装在生成器中:
def next_prev(f):
previous_value = f(0)
i = 1
while True:
next_value = f(i)
yield next_value, previous_value
i += 1
previous_value = next_value
在这个生成器的帮助下,limit HOF 变得更加简单:
def limit(f, eps=1.0e-11):
for next_value, previous_value in next_prev(f):
if abs(next_value - previous_value) < eps:
return next_value
请注意分离的用处:next_prev 体现了“获取函数的下一个和上一个值”的概念,limit 只处理“循环何时终止”。
最后但并非最不重要的一点是,itertools 通常是生成器的一个很好的替代方案,让您可以快速封装挑剔的迭代逻辑(尽管它确实需要一些时间来适应...;-):
import itertools
def next_prev(f):
values = itertools.imap(f, itertools.count())
prv, nxt = itertools.tee(values)
nxt.next()
return itertools.izip(prv, nxt)