我需要首先將串列分成兩半,然后用遞回總結這兩個
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]))
uj5u.com熱心網友回復:
考慮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]))
輸出:
21
uj5u.com熱心網友回復:
當串列變得足夠小時,您的遞回函式需要基本情況??,并且您需要確保每次沒有命中基本情況時,串列都會變小。中點應該是長度的一半,而不是一半(長度減一)——否則當串列達到 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 中串列型別的名稱,覆寫它會破壞您的代碼(或至少會使閱讀變得混亂)。
uj5u.com熱心網友回復:
這些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]))
這比其他答案要多得多,但我認為這使左/右區別更加清晰。它傳遞的只是一個索引和每次通過回圈的運行總數。
很可能將它們組合成一個函式,但是它需要一種指示方向和調整索引的方法,這使得它不太好。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/360830.html
