如何用给定的语言编写以下语句?

a(0) = 1
a_(n+1) = 1 - 1 / ( a_n + 3)

我需要在n时找到最小的a_n -> 0.732050...值。

我在Mathematica中的尝试
a[(x+1)_] = 1 - 1/(a[x_] + 3)

问题显然在此a[(x+1)_]中。
但是,我不知道如何在Mathematica中进行迭代。

最佳答案

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)

09-06 04:20