[英]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
的長度為1
或0
時,考慮添加幾個基本情況:
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.