python - 递归几何序列
问题描述
我无法让我的代码正常工作。我需要写一个递归函数
geometric_recursive
我的问题是我无法停止循环。此外,该函数应具有与迭代版本相同的参数
def geometric(n: int) -> float:
'''
Calculates a finite geometric series with q=0.5 as the base.
'''
result = 0
for k in range(0, n+1):
result += 0.5**k
我的代码是
def geometric_recursive(k : int) -> float:
if k <= 0:
return 1
else:
return 0.5 ** geometric_recursive(k+1)
目标是断言应该通过
assert geometric_recursive(2) == geometric(2)
我希望有一个人可以帮助我
解决方案
首先让我们从数学的角度来看这个公式:SUM[0<=i<n](q**i)
is (1 - q**n) / (1 - q)
。所以对于q=0.5
预期的结果是2
。
并且数学证明我们可以计算它提供q < 1
。
常见的方法是定义一个限制epsilon 并在q**n < epsilon
. 我们知道这个数字将大于 1,并且 Python 浮点数的精度接近 15 位十进制数字(尾数为 48 位)
所以我们可以写:
def g_recurs(q, term=1, tot=0):
# print(q, term, tot) # uncomment for intermediate results
tot += term
term *= q
if term < 1E-16: # stop recursion when q**n < 1E-16
return tot
else:
return g_recurs(q, term, tot)
它按预期给出:
>>> g_recurs(0.5)
2.0
编辑后,您只想计算特定数量的术语,并且q
固定在0.5
. 公式将变为:
def g_recurs(n: int, term=1, tot=0) -> float:
# print(q, term, tot) # uncomment for intermediate results
tot += term
term *= 0.5
if n == 0:
return tot
else:
return g_recurs(n-1, term, tot)
它给出了期望值:
>>> g_recurs(2)
1.75
上面的公式避免了求幂,因为乘法要简单得多,但我现在认为您只是在寻找:
def geometric_recursive(n:int) -> float:
if n == 0:
return 1
term = 0.5 ** n
return term + geometric_recursive(n-1)
这也验证了:
>>> geometric_recursive(2)
1.75
推荐阅读
- ios - 设置 UITableviewcell 以在可见时获取通知?
- java - 从 GUI 类调用字符串 - VariableDeclarators 错误
- r - rcorr 在 cor 完美工作的地方给出错误(需要相关矩阵的 p 值)
- ruby-on-rails - Rails 项目,在使用 capybara 进行测试时:ArgumentError: Unused parameters passing to Capybara::Queries::SelectorQuery : [4]
- sql - 如何将此 SQL 查询转换为 LINQ
- spring - Spring Framework 如何维护每个版本的质量控制
- python-3.x - 想始终以大写字母开头我的密码吗?
- css - Rigel Wordpress 主题悬停框不适用于 ipad 和银河选项卡
- c# - 如果连续四天没有条目,则将列表划分为子列表
- arrays - VueJS 中的多维数组