簡體   English   中英

遞歸幾何序列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM