[英]recursive geometric sequence
我無法讓我的代碼正常工作。 我需要寫一個遞歸的 function
geometric_recursive
我的問題是我無法停止循環。 function 的參數也應與迭代版本相同
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
僅僅因為你每次都給參數 k+1,所以基本上 k 永遠不會 <= 0,這意味着你的 function 會一次又一次地調用自己
遞歸需要一個基本案例。 你沒有(或沒有會擊中)。 該公式趨於無窮大,但這不切實際。 你需要弄清楚什么時候你離答案足夠近才能停下來。 這可以是多次迭代(Python 的最大遞歸深度是一個上限)或精度級別。
此外, function 似乎並不代表公式。 該公式看起來像 q^k 的總和,其中您有 q ^ (q ^ (q ^ (q ^...)))。 沒有求和發生。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.