Java / Python / Mathematica 中的递归序列
如何用给定语言编写以下语句?
a(0) = 1
a_(n+1) = 1 - 1 / ( a_n + 3)
当a_n -> >时,我需要找到
。n
的最小值。 0.732050...
我在 Mathematica 中的尝试
a[(x+1)_] = 1 - 1/(a[x_] + 3)
问题显然出在这个 a[(x+1)_]
中。 但是,我不知道如何在 Mathematica 中迭代执行此操作。
How can you write the following statement in the given languages?
a(0) = 1
a_(n+1) = 1 - 1 / ( a_n + 3)
I need to find the smallest value of n
when a_n -> 0.732050...
.
My attempt in Mathematica
a[(x+1)_] = 1 - 1/(a[x_] + 3)
The problem is apparently in this a[(x+1)_]
.
However, I do not know how to do it iteratively in Mathematica.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
Mathematica
(注意记忆技巧。)
此外,a[n] 收敛(非常快)到 sqrt(3)-1:
Mathematica
(Note the memoization trick.)
Also, a[n] converges (very quickly) to sqrt(3)-1:
Python,最简单:
这会发出
8
,表明递归消除或记忆等优化可能没有必要。当然,通常我们希望以数值方式而不是分析方式获得极限,因此正常的循环方式会相当不同——并且最好封装在高阶函数中......:
非平凡的循环逻辑通常最好封装在生成器:
借助此生成器,
limit
HOF 变得更加简单:注意分离的有用性:
next_prev
体现了“获取下一个和上一个值”的概念函数”,limit
只是处理“循环何时终止”。最后但并非最不重要的一点是, itertools 通常为生成器提供了一个很好的替代方案,让您可以封装挑剔的东西快速迭代逻辑(尽管确实需要一些时间来适应......;-):
Python, simplest:
This emits
8
, suggesting that optimizations such as recursion elimination or memoizing are likely not warranted.Of course normally we'd want to get the limit numerically rather than analytically, so the normal way to loop would be rather different -- and best encapsulated in a higher-order function...:
Nontrivial looping logic is usually best encapsulated in a generator:
with the help of this generator, the
limit
HOF becomes much simpler:Note how useful the separation is:
next_prev
embodies the concept of "get the next and previous value of the function",limit
just deals with "when should the loop terminate".Last but not least, itertools often offers a good alternative to generators, letting you encapsulate finicky iteration logic in speedy ways (though it does take some getting used to...;-):
JavaPython
Java
Python
Mathematica:
我用 k = n + 1 代替,因为这使得表达式更简单。结果是等价的。
Mathematica:
I substituted k = n + 1 because that makes the expression simpler. The result is equivalent.
Python
如果可以的话,我会尽量避免写“while True”之类的。几乎可以肯定,我编写的代码不会永远循环。在这种情况下,它为我运行了十六次。十六比 ℵ-null 小很多。
Python
I try to avoid writing "while True" or such if I can avoid it. Almost certainly no code that I write will loop forever. In this case, it ran sixteen times for me. Sixteen is a lot less than ℵ-null.
Mathematica 中的一行给出了序列的精确元素列表:
最后两个元素之间的差异小于 10^-8。因此需要 8 次迭代:
A one-liner in Mathematica which gives a list of exact elements of your sequence:
The difference between the last two elements is less than 10^-8. It thus have taken 8 iterations: