簡體   English   中英

我如何遞歸地總結列表的兩半

[英]How do i sum up 2 halves of a list recursively

我需要先將列表分成兩半,然后用遞歸總結這兩個

def merge_sum(list):
    
    middle = int(len(list)-1)//2
    first_half = merge_sum(list[:middle])
    second_half = merge_sum(list[middle:])
    return first_half + second_half

print(merge_sum([1,2,3,4,5,6]))

lst的長度為10時,考慮添加幾個基本情況:

def merge_sum(lst):
    if not lst: return 0
    if len(lst) == 1: return lst[0]
    middle = len(lst) // 2
    first_half = merge_sum(lst[:middle])
    second_half = merge_sum(lst[middle:])
    return first_half + second_half

print(merge_sum([1, 2, 3, 4, 5, 6]))

Output:

21

當列表變得足夠小時,您的遞歸 function 需要基本情況,並且您需要確保每次沒有達到基本情況時,列表會變小。 中點應該是長度的一半,而不是一半(長度減一)——否則當列表長度達到 2 個元素時,你的中點將為 0( (2-1)//2 == 0 ),你會永遠無法進一步划分它。

>>> def merge_sum(arr):
...     if len(arr) == 1:
...         return arr[0]
...     if len(arr) == 0:
...         return 0
...     middle = len(arr)//2
...     return merge_sum(arr[:middle]) + merge_sum(arr[middle:])
... 
>>> merge_sum([1, 2, 3, 4, 5, 6])
21

請注意,調用參數list很麻煩,因為list已經是 Python 中列表類型的名稱,並且覆蓋它可能會破壞您的代碼(或至少使其難以閱讀)。

那些list[middle:]是不必要的昂貴的列表副本。 遞歸是一個控制結構,一個循環,你可以通過沿着相同的列表結構移動計數器來做到這一點:

def merge_left(numbers, index, total=0):
  if index < 0:
    return total
  else:
    return merge_left(numbers, (index-1), (total+numbers[index]))

def merge_right(numbers, index, total=0):
  if index == len(numbers):
    return total
  else:
    return merge_right(numbers, (index+1), (total+numbers[index]))

 
def merge_sum(numbers):
  
    middle = len(numbers)//2
    return merge_left(numbers, middle-1) + merge_right(numbers, middle)

print(merge_sum([1,2,3,4,5,6]))

這比其他答案要多得多的代碼,但我認為這使左右區別更加清晰。 它每次通過循環時傳遞的只是一個索引和一個運行總計。

很有可能將它們組合成一個 function,但它需要一種指示方向和調整索引的方法,這使得它不太好。

暫無
暫無

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

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