簡體   English   中英

遞歸匯總列表的元素

[英]Summing the elements of a list recursively

def sum(L):
    if len(L) == 1:
        return L[0]
    i = sum (len (L) // 2)
    if  len(L) > 1:
        return i + i

L=[2,4]

print (sum(L))

當我嘗試運行它時,出現TypeError:類型為'int'的對象沒有len()。

sum (len (L) // 2) ,您要將一個整數( len(L) // 2 )作為L參數傳遞給sum()函數。 (請不要給函數提供與內置函數相同的名稱。)然后遞歸調用sum()嘗試對此整數求len(L) == 1 ,但是整數不支持len() ,並且這樣您就可以得到錯誤消息。 您實際上到底想做什么?

  1. 不要命名函數sum ,它會掩蓋內置函數
  2. 實現您的功能,以便清楚地定義基本案例和遞歸案例。

    對於基本情況,當長度為1時,返回該元素。 你說對了。
    對於遞歸情況,請將列表分成兩半,然后遞歸計算每一半的總和。

def sum_recursive(L):
    if len(L) == 1:
        return L[0]

    idx = len(L) // 2
    return sum_recursive(L[:idx]) + sum_recursive(L[idx:])

sum_recursive必須始終接收列表並返回整數。

一些空運行:

In [5]: sum_recursive([1, 2, 4, 8])
Out[5]: 15

In [6]: sum_recursive([2, 4])
Out[6]: 6

請記住,這將無法處理空列表作為輸入。 如果您也想解決這個問題,請將基本情況更改為:

def sum_recursive(L):
    if len(L) <= 1:
        return sum(L)
    ...

我們在這里利用內置的sum函數,該函數通過返回0來優雅地處理空列表。對於單元素列表,將返回第一個元素(這也是為什么不要遮蓋這些實用程序函數的重要意義)。

如果您不想在那里使用sum ,則需要將基本情況分為兩部分:

def sum_recursive(L):
    if len(L) == 0:
        return 0
    elif len(L) == 1:
        return L[0]
    ...

我認為您的目標是編寫一個遞歸sum函數,該函數將列表連續拆分為較小的塊。 因此,基本上,您需要做的是計算中點的索引,然后使用列表切片將第一個子列表和第二個子列表遞歸地傳遞回函數中,直到剩下01元素的基本情況為止。

def add(values):
    if len(values) == 0:
        return 0
    elif len(values) == 1:
        return values[0]
    mid = len(values)//2
    return add(values[:mid]) + add(values[mid:])

>>> add([1,2,3,4,5])
15

在你的代碼中

i =總和(len(L)// 2)

行引發錯誤,因為在第一次調用sum()之后遞歸傳遞了一個整數而不是列表

def sum(L):
    if len(L) == 0:
        return 0
    elif len(L) == 1:
        return L[0]
    else:
        index = len(L)-1
        return L[index] + sum(L[0:index])

L=[2,4]

print (sum(L))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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